如何在过程中使用返回Oracle参考光标的函数
我必须编写一个Oracle过程,它应该调用返回REF\u CURSOR的Oracle函数。函数是这样声明的如何在过程中使用返回Oracle参考光标的函数,oracle,plsql,procedure,Oracle,Plsql,Procedure,我必须编写一个Oracle过程,它应该调用返回REF\u CURSOR的Oracle函数。函数是这样声明的 FUNCTION "IMPACTNET"."TF_CONVERTPARA" (PARASTRING IN NVARCHAR2) RETURN SYS_REFCURSOR AS c SYS_REFCURSOR; BEGIN OPEN c FOR SELECT SUBSTR(element, 1, INSTR(element, '|') - 1)
FUNCTION "IMPACTNET"."TF_CONVERTPARA" (PARASTRING IN NVARCHAR2) RETURN SYS_REFCURSOR
AS
c SYS_REFCURSOR;
BEGIN
OPEN c FOR
SELECT SUBSTR(element, 1, INSTR(element, '|') - 1) as key,
SUBSTR(element, INSTR(element, '|') + 1, 99999) as val
FROM (
SELECT REGEXP_SUBSTR(PARASTRING, '[^;]+', 1, LEVEL) element
FROM dual
CONNECT BY LEVEL < LENGTH(REGEXP_REPLACE(PARASTRING, '[^;]+')) + 1
);
RETURN c;
END;
你能告诉我需要写些什么才能从我的过程中调用函数吗?我想将一个包含两列的表的所有返回值插入到一个rational表中
提前谢谢你 很明显,这样做应该是可行的,我猜测的是表名和列名,以及您试图实现的确切逻辑
CREATE PROCEDURE some_procedure_name
AS
l_rc SYS_REFCURSOR := impactnet.tf_convertpara( <<some string>> );
l_key VARCHAR2(100);
l_val VARCHAR2(100);
BEGIN
LOOP
FETCH l_rc
INTO l_key, l_val;
EXIT WHEN l_rc%notfound;
INSERT INTO some_table( key_column, val_column )
VALUES( l_key, l_val );
END LOOP;
END;
批量收集结果,然后使用FORALL一次性插入不是更好吗?@Ollie-这样绝对更有效。我追求的是简单而不是性能。但我采纳了你的建议,并发布了一个使用批量收集的示例
CREATE PROCEDURE some_procedure_name
AS
TYPE key_val_rec
IS RECORD(
key VARCHAR2(100),
val VARCHAR2(100)
);
TYPE key_val_coll
IS TABLE OF key_val_rec;
l_rc SYS_REFCURSOR := impactnet.tf_convertpara( <<some string>> );
l_coll key_val_coll;
BEGIN
LOOP
FETCH l_rc
BULK COLLECT INTO l_coll
LIMIT 100;
EXIT WHEN l_coll.count = 0;
FORALL i IN l_coll.FIRST .. l_coll.LAST
INSERT INTO some_table( key_column, val_column )
VALUES( l_coll(i).key, l_coll(i).val );
END LOOP;
END;