Oracle Sql:如何从过程输出表

时间:2013-09-19 18:55:21

标签: sql oracle stored-procedures

我有一张表A(a1,a2,a3);

我想写一个这样的程序:

CREATE OR REPLACE PROCEDURE B
AS
BEGIN
.........
..........
SELECT * FROM A;
END

这样当我做EXECUTE B;

应该输出表A

select * from A;

中发生

看到我尝试了其他答案,但它对我不起作用,这就是我发布这个问题的原因

2 个答案:

答案 0 :(得分:5)

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子句中使用它。

答案 1 :(得分:0)

我正在搜索帖子,看看从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));

查找更多信息@ http://sqlbisam.blogspot.com/2013/12/output-table-or-multiple-rows-from-stored-procedure-function.html