Oracle SQL Developer PL / SQL返回一个数组

时间:2015-02-06 17:28:33

标签: oracle stored-procedures plsql procedure cursors

离散事件,

我到处都搜索过,但我找不到解决这个简单问题的方法。

情况:

我需要编写一个过程,其中以列名作为输入,并将该列中存在的所有不同值作为输出返回。然后我必须在一些c#代码中使用此过程。

在MS服务器中,它非常简单,因为它将直接提供与PL / SQL不同的结果集。

我可以写的脚本(这不是给我我需要的结果):

CREATE OR REPLACE
PROCEDURE GetCol(PARAM IN STRING, recordset OUT sys_refcursor)
AS
BEGIN
OPEN recordset FOR
SELECT DISTINCT(PARAM)
FROM my_table;
END

当我尝试使用以下代码检查记录集中的数据时:

DECLARE
  l_cursor  SYS_REFCURSOR;
  l_sname VARCHAR2(50);
BEGIN
  GetCol('col_name',l_cursor);
    LOOP 
    FETCH l_cursor INTO  l_sname;
    EXIT WHEN l_cursor%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE(l_sname);
  END LOOP;
  CLOSE 

请有人帮我解决这个问题。

2 个答案:

答案 0 :(得分:3)

您还可以为字符串值打开ref_cursor。请看一下:

CREATE OR REPLACE PROCEDURE GetCol(PARAM IN VARCHAR2, recordset OUT sys_refcursor)
AS
QRY varchar2(100);
BEGIN
QRY := 'SELECT DISTINCT '||PARAM||' FROM my_table';
OPEN recordset FOR QRY;
END;

然后:

DECLARE
  l_cursor  SYS_REFCURSOR;
  l_sname VARCHAR2(50);
BEGIN
  GetCol('col_name',l_cursor);
    LOOP 
    FETCH l_cursor INTO  l_sname;
    EXIT WHEN l_cursor%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE(l_sname);
  END LOOP;
END;

答案 1 :(得分:2)

您的问题是由于程序的SELECT语句中PARAM的含义模糊不清引起的:

CREATE OR REPLACE
PROCEDURE GetCol(PARAM IN STRING, recordset OUT sys_refcursor)
AS
BEGIN
OPEN recordset FOR
SELECT DISTINCT(PARAM) -- Ambiguity here
FROM my_table;
END;

PARAM是否引用表列或过程的第一个参数? Oracle已经采用了该参数。你可以明确地说出这样的:

SELECT DISTINCT(my_table.PARAM) 
FROM my_table;

您可以在适当的时候(可能不是这里)指定过程参数:

SELECT DISTINCT(GetCol.PARAM) 
FROM my_table;

通常最好通过以下方式避免:

  • 始终在列引用select语句和
  • 中使用表别名
  • 具有参数名称的标准,使其不太可能发生冲突,例如P_PARAM。