简体   繁体   English

PL / SQL动态SQL

[英]PL/SQL Dynamic SQL

I need help. 我需要帮助。 I have a problem in constructing my PL/SQL block. 我在构造PL / SQL块时遇到问题。 In the cursor, I have a query constructed, and i want to insert a filter on cursor. 在游标中,我构造了一个查询,并且我想在游标上插入一个过滤器。 Below is an example: 下面是一个示例:

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';

Can anyone assist me in this construction? 谁能协助我进行这项建设?

You can use a parameterized cursor: 您可以使用参数化的游标:

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;
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;

You can try it like this: 您可以这样尝试:

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' );

Or like this: 或像这样:

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

Here is a simple solution: 这是一个简单的解决方案:

DECLARE code NUMBER; DECLARE代码NUMBER; parameters_amb myOthertable%ROWTYPE; parameters_amb myOthertable%ROWTYPE;

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM