【问题标题】:PL/SQL Dynamic SQLPL/SQL 动态 SQL
【发布时间】:2012-10-09 14:09:56
【问题描述】:

我需要帮助。我在构建 PL/SQL 块时遇到问题。 在游标中,我构造了一个查询,我想在游标上插入一个过滤器。下面是一个例子:

DECLARE 
code NUMBER;
parameters_amb myOthertable%ROWTYPE;

CURSOR test is SELECT id from mytable
 if parameters_amb.test2 is not null  then
    where mytable.name = 'NAMETABLE'
 else
    where mytable.name = 'NAMETABLE2';

任何人都可以帮助我进行这个施工吗?

【问题讨论】:

    标签: oracle plsql cursor conditional


    【解决方案1】:

    您可以使用参数化光标:

    DECLARE 
    code NUMBER;
    parameters_amb myOthertable%ROWTYPE;
    param mytable.name%TYPE;
    
    CURSOR test (p_name VARCHAR2) is 
      SELECT id 
        FROM mytable
       WHERE mytable.name = p_name;
    BEGIN
      if parameters_amb.test2 is not null  then
        param := 'NAMETABLE'
      else
        param := 'NAMETABLE2';
      end if;
    
      OPEN test(param);
    
      -- Add code to fetch and read from cursor
    END;
    

    【讨论】:

      【解决方案2】:

      你可以这样试试:

      DECLARE  
        code NUMBER; 
        parameters_amb myOthertable%ROWTYPE;  
        CURSOR test is SELECT id 
                       from mytable  
                       WHERE (parameters_amb.test2 is not null AND mytable.name = 'NAMETABLE' )
                         OR (parameters_amb.test2 is null AND mytable.name = 'NAMETABLE2' );
      

      或者像这样:

      DECLARE  
        code NUMBER; 
        parameters_amb myOthertable%ROWTYPE;  
        CURSOR test is SELECT id 
                       from mytable  
                       WHERE mytable.name = 
                             CASE WHEN parameters_amb.test2 is not null THEN 'NAMETABLE'
                                  WHEN parameters_amb.test2 is null THEN 'NAMETABLE2' END
      

      【讨论】:

      【解决方案3】:
      DECLARE
       stmt varchar2(1000);
       code NUMBER;
       parameters_amb myOthertable%ROWTYPE;
      BEGIN
       stmt := 'SELECT id from mytable';
       if parameters_amb.test2 is not null  
       then
          stmt := stmt||' where mytable.name = ''NAMETABLE''';
       else
          stmt := stmt||' where mytable.name = ''NAMETABLE2''';
       end if;
      
       OPEN test FOR stmt;
      ...
      ...
      END;
      

      【讨论】:

        【解决方案4】:

        这是一个简单的解决方案:

        声明 代码编号; 参数_amb myOthertable%ROWTYPE;

        CURSOR 测试是 SELECT id from mytable 其中 mytable.name = NVL2(parameters_amb.test2, 'NAMETABLE', 'NAMETABLE2');

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-07-29
          • 2012-04-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-09
          • 2018-05-31
          • 1970-01-01
          相关资源
          最近更新 更多