zoukankan      html  css  js  c++  java
  • Oracle数据库中动态执行SQL

    在Oracle数据库开发PL/SQL块中我们使用的SQL
        静态SQL: 在PL/SQL块中使用的SQL语句在编译时是明确的,执行的是确定对象。
        动态SQL: 在PL/SQL块编译时SQL语句是不确定的,如根据用户输入的参数的不同而执行不同的操作。

      1、跟据动态条件获得数据集

        /*定义游标*/
      TYPE App_CUR IS REF CURSOR;

      
    /*定义存储过程*/
      PROCEDURE sp_QueryAppName(p_where1     VARCHAR2,
                     p_where2     VARCHAR2,
                     p_where3     VARCHAR2,
                                  P_outCursor1    OUT App_CUR);


      
    /*实现存储过程 查询表 返回游标*/
      PROCEDURE sp_QueryAppName(p_where1     VARCHAR2,
                     p_where2     VARCHAR2,
                     p_where3     VARCHAR2,
                                  P_outCursor    OUT App_CUR) IS
        mainSql  varchar2(
    32767);
        condition varchar2(
    32767);
      BEGIN

      
    --动态条件
      IF p_where1  IS NOT NULL THEN
        condition :
    = condition || ' AND t.where1 = ''' || p_where1 || '''';
      END IF;

      IF p_where2  IS NOT NULL THEN
            condition :
    = condition || ' AND t.where2 = ''' || p_where2 || '''';
      END IF;

      IF p_where3  IS NOT NULL THEN
            condition :
    = condition || ' AND t.where3 = ''' || p_where3 || '''';
      END IF;

      
    --动态语句
      mainSql :
    = 'SELECT t.field1, t.field2, t.field3, t.field4  FROM table1 t ' ||
                    condition 
    || ' ORDER BY  t.fieldname DESC';

      
    --执行语名并返回游标
      OPEN P_outCursor FOR mainSql;
      EXCEPTION 
      WHEN OTHERS THEN 
               
    null;

      END;

      注:定义部分应置于包头,实现部分应置于包体

      

    2、动态操作表数据

    /*定义存储过程*/
      PROCEDURE sp_InsertAppName(p_field1     VARCHAR2,
                      p_field2     VARCHAR2,
                      p_field3 OUT INTEGER);
     
      
    /*实现存储过程 添加加数据 返回编码*/
      PROCEDURE sp_InsertAppName(p_field1     VARCHAR2, 
                      p_field2     VARCHAR2,
                      p_field3 OUT INTEGER) IS
      i_id INTEGER;
      mainSql  varchar2(
    32767);

      BEGIN
        SELECT sequencename.nextval INTO i_id FROM DUAL;
        p_field3 :
    = i_id;
        mainSql 
    = 'INSERT INTO tablename values(' || i_id || ',:1,:2)';
        
    --动态执行插入操作
        execute immediate str_sql 
    using field1,field2; 
        EXCEPTION 
                WHEN OTHERS THEN 
                
    null;

       END;
     
      注:定义部分应置于包头,实现部分应置于包体

     3、执行存储过程

    declare v_msg varchar2(20);
    begin
    pk_webinterface.sp_InsertAppName(v_msg);
    
    dbms_output.PUT_LINE(v_msg);
    end;
  • 相关阅读:
    JVM 性能调优工具:jstat 使用
    JVM 性能调优工具,列表
    Mac 上 java 究竟在哪里,本文彻底让你搞清楚!
    Java 中常用锁实现的方式有两种:1. 用并发包中的锁类;2. 使用同步代码块
    Android 9.0 配置 charles 的 https 抓包
    背景,不要用:background-size: contain; 推荐用:background-size: 100% 100%;
    textarea 过滤 emoji 表情和空格(如果只 replace emoji 表情,会产生一个空格,所以再 replace 空格)
    小程序 textarea 无法隐藏的解决方案
    textarea 过滤 emoji 表情
    wx.setClipboardData:检测有复制内容再弹窗
  • 原文地址:https://www.cnblogs.com/Nadim/p/Dynamic_SQL.html
Copyright © 2011-2022 走看看