2017-09-29 170 views
0

我想創建一個函數,將採取在表名稱,採取該表名稱並將列入名稱,因爲這是表的設計。該函數還包含表中的代碼PK,並使用它構造一個Dynamic語句,該語句將選擇該值並將其返回給變量。動態SQL選擇到一個變量

我得到這樣的錯誤:

SP2-0552:綁定變量 「LOC_CODE_TAB」 未聲明。

所以我的主要問題是何時使用派生值作爲綁定變量,何時不使用。

這裏是我嘗試例如:

DECLARE 
    loc_stmt  VARCHAR2(200); 
    loc_return VARCHAR2(30) := null; 
    loc_code_tab VARCHAR2(30); 
    P_TABLE_NAME VARCHAR2(100) := 'BILLG_FRQNCY_TYPE'; 
    P_CODE  NUMBER := 1; 
BEGIN 
    loc_code_tab := SUBSTR(P_TABLE_NAME,1,LENGTH(P_TABLE_NAME)-3); 

    loc_stmt := 
     'SELECT ' || :loc_code_tab || '_DESC' || 
     ' INTO ' || loc_return || 
     ' FROM ' || :loc_code_tab || 
     ' WHERE ' || P_TABLE_NAME || ' = ' || :P_CODE; 

    EXECUTE IMMEDIATE loc_stmt 
     INTO loc_return 
     USING IN loc_code_tab, IN loc_code_tab, IN P_CODE; 
    DBMS_OUTPUT.PUT_LINE(loc_return); 
END; 
/

回答

2

不能使用placeholders在動態查詢表中的列。但是,您可以使用連接來實現您的要求。請看下圖:

DECLARE 
    loc_stmt  VARCHAR2 (200); 
    loc_return  VARCHAR2 (30) := NULL; 
    loc_code_tab VARCHAR2 (30); 
    P_TABLE_NAME VARCHAR2 (100) := 'BILLG_FRQNCY_TYPE'; 
    P_CODE   NUMBER := 1; 
BEGIN 
    loc_code_tab := SUBSTR (P_TABLE_NAME, 1, LENGTH (P_TABLE_NAME) - 3); 

    loc_stmt := 
     'SELECT ' 
     || loc_code_tab 
     || '_DESC' 
     || ' FROM ' 
     || loc_code_tab 
     || ' WHERE ' 
     || P_TABLE_NAME 
     || ' = ' 
     || P_CODE; 

    EXECUTE IMMEDIATE loc_stmt INTO loc_return ; 

    DBMS_OUTPUT.PUT_LINE (loc_return); 
END; 
/
+0

非常感謝,那個竅門 – programmerNOOB

+0

確定你的語法看起來更好,所以我會upvote你。我已經採取了原來的一個看起來有點混亂 – Kacper

+0

p_code注意你可以(實際上你應該)使用佔位符和綁定變量。 –

1

從varaibles的名字刪除:和遷入立即執行的適當位置。

DECLARE 
    loc_stmt  VARCHAR2(200); 
    loc_return VARCHAR2(30) := null; 
    loc_code_tab VARCHAR2(30); 
    P_TABLE_NAME VARCHAR2(100) := 'BILLG_FRQNCY_TYPE'; 
    P_CODE  NUMBER := 1; 
BEGIN 
    loc_code_tab := SUBSTR(P_TABLE_NAME,1,LENGTH(P_TABLE_NAME)-3); 

    loc_stmt := 
     'SELECT ' || loc_code_tab || '_DESC' || 
     ' FROM ' || loc_code_tab || 
     ' WHERE ' || P_TABLE_NAME || ' = ' || P_CODE; 

    EXECUTE IMMEDIATE loc_stmt 
     INTO loc_return; 
    DBMS_OUTPUT.PUT_LINE(loc_return); 
END; 
/
+0

與我在下面發表的內容非常相似。 – XING

+0

@XING yup。我只是快了幾秒;)這個想法是一樣的 – Kacper

+0

非常感謝你,就是這樣。下一個要解決的問題是如何使用Dynamic進入關聯數組。這同樣的邏輯會在那裏工作嗎? – programmerNOOB