[英]How to give change working of having function dynamicaly on executing an sql statement?
[英]Oracle How to Dynamicaly change argument/parameter in function with loop
如何使用循環動態更改管道函數中的參數/參數? 這是示例。
CREATE OR REPLACE FUNCTION TESTES(
P_VALUE1 VARCHAR2,
P_VALUE2 VARCHAR2,
P_VALUE3 VARCHAR2
)RETURN VARCHAR2
PIPELINED
AS
L_DYNM VARCHAR2(1000);
L_QUERY VARCHAR2(1000);
L_RETURN VARCHAR2(1000);
BEGIN
FOR i IN 1..3 LOOP
L_DYNM := 'P_VALUE' || i || ',';
END LOOP;
L_QUERY := 'SELECT' || L_DYNM ||'FROM DUAL';
/* SELECT SME_PACE.SYS_REGEX_DEBIT(P_VALUE) INTO L_RETURN FROM DUAL; */
FOR V_REC IN (
EXECUTE IMMEDIATE L_QUERY
INTO L_RETURN
)
LOOP
PIPE ROW (
OBJECT_TESTES(
V_REC.FIELD1, V_REC.FIELD2, V_REC.FIELD3
);
END LOOP;
END;
所以我實際上想要嘗試做的是從雙動態運行SELECT P_VALUE1, P_VALUE2, P_VALUE3並在管道行上使用它。
我必須這樣做是有原因的,我需要一個答案是否可以這樣做? 所以我可以將它應用到我的項目中。
謝謝
您的功能有很多不一致之處:
VARCHAR2
但您正在嘗試使用將返回集合的PIPELINE
。L_DYNM
的值。DUAL
表只有一個DUMMY
列時,您正試圖從DUAL
表中選擇三個動態列名。然后你有語法錯誤:
FOR
語句中EXECUTE IMMEDIATE
。你可能想要這樣的東西:
CREATE TYPE object_testes IS OBJECT(
a VARCHAR2(100),
b VARCHAR2(100),
c VARCHAR2(100)
);
CREATE TYPE object_testes_table IS TABLE OF object_testes;
CREATE OR REPLACE FUNCTION TESTES(
P_VALUE1 VARCHAR2,
P_VALUE2 VARCHAR2,
P_VALUE3 VARCHAR2
) RETURN object_testes_table PIPELINED
AS
p_cur SYS_REFCURSOR;
p_sql VARCHAR2(4000);
p_field1 VARCHAR2(100);
p_field2 VARCHAR2(100);
p_field3 VARCHAR2(100);
BEGIN
p_sql := 'SELECT ' || DBMS_ASSERT.ENQUOTE_NAME( p_value1 ) || ', '
|| DBMS_ASSERT.ENQUOTE_NAME( p_value2 ) || ', '
|| DBMS_ASSERT.ENQUOTE_NAME( p_value3 ) || ' '
|| 'FROM DUAL';
OPEN p_cur FOR p_sql;
LOOP
FETCH p_cur INTO p_field1, p_field2, p_field3;
EXIT WHEN p_cur%NOTFOUND;
PIPE ROW (
OBJECT_TESTES(
p_field1,
p_field2,
p_field3
)
);
END LOOP;
CLOSE p_cur;
END;
/
然后:
SELECT * FROM TABLE( testes( 'DUMMY', 'DUMMY', 'DUMMY' ));
輸出:
\n一個 | 乙 | C \n :- | :- | :-\n X | X | X \n
db<> 在這里擺弄
試試下面的方法。 這將做同樣的事情,但不使用select P_Value1 dual
。
創建對象:
CREATE TYPE sample_record AS OBJECT (P_VALUE1 VARCHAR2(10),
P_VALUE2 VARCHAR2(10),
P_VALUE3 VARCHAR2(10)
);/
然后創建創建對象的數組。
CREATE TYPE sample_records IS TABLE OF sample_record; /
將對象轉換為管道行的函數:
CREATE OR REPLACE FUNCTION test (P_VALUE1 VARCHAR2,P_VALUE2 VARCHAR2,P_VALUE3 VARCHAR2)
RETURN sample_records PIPELINED AS
BEGIN
PIPE ROW(sample_record(P_VALUE1,P_VALUE2,P_VALUE3));
RETURN;
END;
/
然后按照下面的方式調用上面的函數。 您也可以在循環中調用它:
select * from table(test('A','B','C'));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.