簡體   English   中英

Oracle SQL Developer PL / SQL返回一個數組

[英]Oracle SQL Developer PL/SQL return an array

開發者,

我到處都搜索,但我找不到解決這個簡單問題的方法。

情況:

我需要編寫一個過程,其中以列名作為輸入,並將該列中存在的所有不同值作為輸出返回。 然后我必須在一些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 

請有人幫我解決這個問題。

您還可以為字符串值打開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;

您的問題是由於程序的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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM