2012-10-09 83 views
2

我需要幫助。我在構建我的PL/SQL塊時遇到了問題。 在遊標中,我有一個查詢構造,並且我想在遊標上插入一個過濾器。下面是一個例子:PL/SQL動態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'; 

任何人都可以幫助我在這種結構?

回答

0

,您可以嘗試這樣的:

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 
+0

我找到了解決方案。 「String literal」
使用「使用遊標變量進行動態查詢(PL/SQL)」
參考鏈接:http: %2Fcom.ibm.db2.luw.apdv.plsql.doc%2Fdoc%2Fc0053894.html 謝謝 –

+0

@RogerioSantos,但這意味着你在一個你不需要的地方使用動態sql(或者我誤解你的問題?)。你可以閱讀這篇文章,爲什麼它不好http://www.adp-gmbh.ch/ora/bad_dynamic_sql.html –

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

您可以使用參數光標:

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

下面是一個簡單的解決方案:

DECLARE code NUMBER; parameters_amb myOthertable%ROWTYPE;

CURSOR測試是從MYTABLE SELECT id其中mytable.name = NVL2(parameters_amb.test2, 'NAMETABLE', 'NAMETABLE2');