Oracle SQL Developer PL/SQL返回一个数组
开发人员 我到处都找遍了,但我找不到这个简单问题的解决办法 情况: 我需要编写一个过程,其中它将列名作为输入,并将该列中存在的所有不同值作为输出返回。然后我必须在一些c代码中使用这个过程 在MS server中,这非常简单,因为它将直接给出与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
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;