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;
  • 相关阅读:
    关于JS中判断两个数组相等
    用JS实现二叉树
    elementUI select组件 默认选择第一项
    angular [src] 绑定url或src 报XSS错误
    easy-mock本地搭建工程实操
    array splice split || string split slice 傻傻分不清楚=>终于弄清楚了
    循环=>轮回=>js循环比拼
    vue-cli 搭建工程配置 => 你想要这里都有
    git分支问题 查看、创建、关联、删除本地/远程分支
    vue知识点 && 错误点 => 持续更新
  • 原文地址:https://www.cnblogs.com/Nadim/p/Dynamic_SQL.html
Copyright © 2011-2022 走看看