我有一张桌子 A(a1,a2,a3);
我想写一个这样的程序:
CREATE OR REPLACE PROCEDURE B
AS
BEGIN
.........
..........
SELECT * FROM A;
END
所以当我这样做的时候EXECUTE B;
它应该输出表A
就像发生在select * from A;
看到我尝试了其他答案,但它对我不起作用,这就是我发布这个问题的原因
我有一张桌子 A(a1,a2,a3);
我想写一个这样的程序:
CREATE OR REPLACE PROCEDURE B
AS
BEGIN
.........
..........
SELECT * FROM A;
END
所以当我这样做的时候EXECUTE B;
它应该输出表A
就像发生在select * from A;
看到我尝试了其他答案,但它对我不起作用,这就是我发布这个问题的原因
SQL Server(我相信您曾表示您来自不同的问题)与 Oracle 不同。您不能只拥有一个执行查询的过程。
您可以将您的过程定义为具有OUT
类型的参数SYS_REFCURSOR
。
CREATE OR REPLACE PROCEDURE b( p_rc OUT SYS_REFCURSOR )
AS
BEGIN
OPEN p_rc
FOR SELECT *
FROM a;
END;
然后,您的过程的调用者需要知道如何从该引用游标中获取数据并对结果做一些有意义的事情。如果您使用 SQL*Plus
SQL> variable rc refcursor;
SQL> exec b( :rc );
SQL> print rc
如果您使用的不是 SQL*Plus,代码可能会有所不同。
或者,您的过程可以返回一个 PL/SQL 集合。或者它可能是一个流水线表函数而不是一个过程,在这种情况下,您可以在FROM
查询的子句中使用它。
我正在搜索帖子以查看一种从 oracle 函数为我的 ssis 包输出数据的方法,所以我想我将分享有关在 oracle 中使用管道以输出类似表的信息
--创建表类型对象来定义行的格式
CREATE OR REPLACE TYPE OUTPUT_TABLE_TYPE
IS OBJECT (
COL1 VARCHAR(100),
COL2 NUMBER
);
--根据上述对象创建表类型
CREATE OR REPLACE TYPE OUTPUT_TABLE
AS TABLE OF OUTPUT_TABLE_TYPE
CREATE OR REPLACE FUNCTION FN_OUT_TABLE (INPARAM1 IN NUMBER)
RETURN OUTPUT_TABLE PIPELINED
IS
BEGIN
FOR RECORD_OUTPUT IN (
SELECT * FROM (
SELECT CAST('OUTPUT SAM1' AS VARCHAR(100)) AS COL1,CAST( 1 AS NUMBER) AS COL2 FROM DUAL
UNION ALL
SELECT CAST('OUTPUT SAM2' AS VARCHAR(100)) AS COL1,CAST( 2 AS NUMBER) AS COL2 FROM DUAL
) SAM_TEMP -- replace this sub query with your query
WHERE COL2=INPARAM1
)
LOOP
PIPE ROW (OUTPUT_TABLE_TYPE(RECORD_OUTPUT.COL1,RECORD_OUTPUT.COL2));
END LOOP;
END;
要获得输出,我们需要在 select 语句下面运行
SELECT * FROM TABLE(FN_OUT_TABLE(2));