2015-10-06 35 views
0

我有一個採用輸入變量的plsql過程。這個變量(my_plsql_var)我需要決定我的select語句的where子句。如果我的變量是A,那麼我需要查詢一個特定的where子句,如果它是B它使用那個特定的where子句,並且同樣適用於C.我嘗試了一些查詢,但它們不起作用。我得到的最接近的是這個,但似乎有語法錯誤,甚至不確定查詢是否會產生我所需要的。有條件的地方條款基於過程輸入的Oracle SQL可變

SELECT ID, 
    CASE(CAST WHEN my_col1 in ('A') and my_col2 = 'A' then 'A GROUP' 
          WHEN my_col1 in ('B') and my_col2 = 'B' then 'B GROUP' 
          WHEN my_col1 in ('C') and my_col2 = 'C' then 'C GROUP' 
          else null 
     end as varachar2)) as my_awesome_col 
     FROM 
     my_table 
     WHERE 
     id= 100 and 
     name = 'Smith' and 
     CASE (WHEN my_plsql_var = 'A' then my_col1 in ('A') and my_col2 = 'A' 
      WHEN my_plsql_var = 'B' then my_col1 in ('B') and my_col2 = 'B' and my_special_col = 'B' 
      WHEN my_plsql_var = 'C' then my_col1 in ('C') and my_col2 = 'C' 
     end as varachar2) 

回答

1

難道這不僅僅是簡化到這個嗎?

SELECT ID, 
    my_plsql_var || ' GROUP' AS Group 
FROM my_table 
WHERE ID = 100 
    AND NAME = 'Smith' 
    AND (
      (my_plsql_var = 'A' AND my_col1 IN ('A') AND my_col2 = 'A') 
     OR (my_plsql_var = 'B' AND my_col1 IN ('B') AND my_col2 = 'B' AND my_special_col = 'B') 
     OR (my_plsql_var = 'C' AND my_col1 IN ('C') AND my_col2 = 'C') 
    ); 
+0

哇哈哈的作品是如此簡單。謝謝! – user2924127

0

這個最好的辦法是使用動態SQL ...

樹立一個字符串SELECT語句,然後使用execute立即運行查詢,如下。下面的代碼沒有經過測試,所以可能會有一些語法錯誤,但應該給你一個如何去做的想法。否則Google動態SQL。

my_sql_string := 'SELECT ID, 
        CASE(CAST WHEN my_col1 in (''A'') and my_col2 = ''A'' then ''A GROUP'' 
         WHEN my_col1 in (''B'') and my_col2 = ''B'' then ''B GROUP'' 
         WHEN my_col1 in (''C'') and my_col2 = ''C'' then ''C GROUP'' 
         else null 
     end as varachar2)) as my_awesome_col 
     FROM 
     my_table 
     WHERE 
     id= 100 and 
     name = ''Smith'' and '; 

if my_plsql_var = 'A' then 
    my_sql_string := my_sql_string || 'my_col1 in (''A'') and my_col2 = ''A'''; 
else if my_plsql_var = 'B' then 
    my_sql_string := my_sql_string || 'my_col1 in (''B'') and my_col2 = ''B'''; 
else if my_plsql_var = 'C' then 
    my_sql_string := my_sql_string || my_col1 in (''C'') and my_col2 = ''C'''; 
end if; 
v_output := execute immediate my_sql_string; 
0

你需要評估你的投入和動態地構建....

不能肯定你想要什麼程序做的,但這個只是打開一個裁判光標想必你會用它做什麼。

希望這會有所幫助。

create or replace procedure my_plsql_procedure 
    (
     my_plsql_var in varchar2 
    ) 
    is 
     dataset sys_refcursor; 
     strSql CLOB; 
     strPred VARCHAR2(500); 
     bAddOtherPred boolean := my_plsql_var = 'B'; 
    begin 
     if bAddOtherPred then 
      strPred := q'~ and my special_col = 'B' ~'; 
     else 
      strPred := null; 
     end if; 

     strSql := q'~ 
      select id, 
        CASE when my_col1 = myCol2 and my_col1 = 'A' THEN 'A GROUP' 
         when my_col1 = myCol2 and my_col1 = 'B' THEN 'B GROUP' 
         when my_col1 = myCol2 and my_col1 = 'C' THEN 'C GROUP' 
         else null end as my_awesome_col 
      from my_table 
      where my_col1 = my_col2 
      and my_col1 = :my_plsql_var 
      and id = 100 
      and name = 'Smith' ~' || strPred; 

     open dataset 
     for strSql 
     using my_plsql_var; 

    end; 
0
 Hello you need to build the SELECT Clause dynamically based upon your input. Below is the example for this. 


     CREATE OR REPLACE PROCEDURE TEST1_DYN(
     p_in IN VARCHAR2, 
     p_ref OUT sys_refcursor) 
    AS 
     lv_select LONG; 
    BEGIN 
     lv_select:='SELECT ID,  
        (CASE WHEN my_col1 in ('''||p_in||''')'|| 'and my_col2 = '''||p_in||''''||' then '||''''||p_in||' GROUP'''|| 
        ' else null   
        end) my_awesome_col   
        FROM   
        my_table   
        WHERE   
        id= 100 and   
        name = ''Smith'' and   
        my_plsql_var = '||''''||p_in||''''||' then my_col1 in ('||''''||p_in||''''||') and my_col2 = '||''''||p_in||'''    
        '; 
     dbms_output.put_line(lv_select); 
OPEN p_ref for lv_select; 
    END;