簡體   English   中英

PL / SQL動態SQL

[英]PL/SQL Dynamic SQL

我需要幫助。 我在構造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';

誰能協助我進行這項建設?

您可以使用參數化的游標:

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;

您可以這樣嘗試:

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

這是一個簡單的解決方案:

DECLARE代碼NUMBER; parameters_amb myOthertable%ROWTYPE;

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