2016-03-07 46 views
0

下面是我正在處理的pl/sql代碼的一部分。我想生成dyamic sql,查看i_emp Nested Table中的值並將結果返回給CharArray。下面的代碼無法正常工作,需要在固定的代碼使用嵌套表在Oracle PL/SQL中構建動態SQl

幫助這只是示例代碼,應使用動態SQL

TYPE NestArray IS TABLE OF VARCHAR2(50); 
TYPE CharArray IS TABLE OF VARCHAR2(255) INDEX BY BINARY_INTEGER; 

PROCEDURE SAMPLE(i_emp IN NestArray) 

v_emp_name CharArray; 

v_sql := 'SELECT emp_name FROM emp '; 
v_sql := v_sql || ' WHERE empid IN (SELECT column_value FROM TABLE('||i_emp||'))'; 

EXECUTE IMMEDIATE v_sql BULK COLLECT INTO v_emp_name; 

end; 
+0

爲什麼這需要動態?也許如果你解釋你的數據是如何配置的,我們可以爲你提供更好的解決方案。現在,這個查詢沒有理由是動態的。 –

+0

我的代碼包含一些基於哪些sql將生成類似於下面的條件IF i_emp_flg ='Y'THEN v_sql:= v_sql || 'AND emp_address ='''|| i_emp_address ||''''; ELSIF i_emp_flg ='N'THEN v_sql:= v_sql || 'AND emp_address IS NULL'; – Harish

+0

類型和程序是在一個包? – Recoil

回答

0

請參見下面的代碼片段來完成。它將描述解決方案。希望它可以幫助

--Create schema level type object 

CREATE OR REPLACE TYPE NestArray IS TABLE OF VARCHAR2(50); 

CREATE OR REPLACE PROCEDURE EMP_BULK(p_empni IN NestArray) 
AS 
TYPE CharArray 
IS 
    TABLE OF VARCHAR2(255) INDEX BY BINARY_INTEGER; 
    v_emp_name CharArray; 
-- emp_id NestArray:=NestArray(1,2,3); 
-- v_sql LONG; 
BEGIN 
    SELECT ename BULK COLLECT 
    INTO v_emp_name 
    FROM emp 
    WHERE EMPno IN 
    (SELECT COLUMN_VALUE FROM TABLE(p_empni) 
    ); 
END; 

EXEC EMP_BULK(NestArray(1,2,3)); 


----------------------------OUTPUT------------------------------------------- 

PL/SQL procedure successfully completed. 
0

你不需要動態SQL和嵌套查詢可以與MEMBER操作者更換。你可以這樣做:

CREATE TYPE NestArray IS TABLE OF VARCHAR2(50); 
CREATE TYPE CharArray IS TABLE OF VARCHAR2(255); 


CREATE OR REPLACE PROCEDURE SAMPLE(
i_emp IN NestArray, 
o_names OUT Chararray 
) 
IS 
BEGIN 
    SELECT emp_name 
    BULK COLLECT INTO o_names 
    FROM emp 
    WHERE empid MEMBER OF i_emp; 
END; 
/