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;
原文地址:https://www.cnblogs.com/Nadim/p/Dynamic_SQL.html