• 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;
  • 相关阅读:
    staticmethod classmethod
    Cache Buffer 区别
    Apache 各启动方式的差别
    网段,掩码
    容器镜像国内下载加速----借助阿里
    import 本质
    数字签名证书的事儿
    java中的sql语句中如果有like怎么写
    VMware+centos7克隆多个虚拟机
    使用Ajax轮询模拟简单的站内信箱(消息管理)功能
  • 原文地址:https://www.cnblogs.com/Nadim/p/Dynamic_SQL.html
Copyright © 2020-2023  润新知