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

Oracle SQL Developer PL/SQL返回一个数组,oracle,stored-procedures,plsql,procedure,cursors,Oracle,Stored Procedures,Plsql,Procedure,Cursors,开发人员 我到处都找遍了,但我找不到这个简单问题的解决办法 情况: 我需要编写一个过程,其中它将列名作为输入,并将该列中存在的所有不同值作为输出返回。然后我必须在一些c代码中使用这个过程 在MS server中,这非常简单,因为它将直接给出与PL/SQL不同的结果集 我可以写的脚本并没有给出我需要的结果: CREATE OR REPLACE PROCEDURE GetCol(PARAM IN STRING, recordset OUT sys_refcursor) AS BEGIN OPEN r

开发人员

我到处都找遍了,但我找不到这个简单问题的解决办法

情况:

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

在MS server中,这非常简单,因为它将直接给出与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 

有人能帮我写一下这段代码吗。

您的问题是由于过程的SELECT语句中的参数不明确造成的:

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_参数。
您还可以为字符串值打开ref_光标。请看一下:

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;
然后:


逻辑看起来正确,但select语句很奇怪。如果您从my_表中运行select distinct'col_name',您会得到什么?您需要执行立即执行。我只需要从该特定列获取所有唯一值。这里的PARAM是列名,也是该过程的唯一IN参数。当任何用户提供列名时,过程都应该返回该特定列中存在的所有不同值。这很有帮助!谢谢。
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;