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/archive/2010/04/02/Dynamic_SQL.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值