2015-02-06 4 views
2

Devs,Oracle SQL Developer PL/SQL возвращает массив

Я искал везде, где могу, но я не мог найти решение этой простой проблемы.

Ситуация:

мне нужно написать процедуру, где он принимает имя столбца в качестве входных данных и возвращает все различные значения, присутствующие в этой колонке в качестве выхода. И тогда я должен использовать эту процедуру в некотором коде C#.

В MS-сервере это очень просто, так как он непосредственно даст набор результатов, в отличие от PL/SQL.

Script Я мог бы написать (который не дает мне результат мне нужно):

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 

Может кто-то помочь мне с этим кодом, пожалуйста.

+0

Логика выглядит правильно, но ваш оператор выбора странно. Если вы запустите «select different (« col_name ») из my_table« что вы получаете? Вам нужно выполнить немедленное выполнение. – OldProgrammer

+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; 
+0

ЧТО ПОМОГАЕТ! Большое спасибо. –

+0

Добро пожаловать, человек :) – Aramillo

2

Ваша проблема вызвана неопределенностью о том, что 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; 

Обычно это лучше избегать:

  • всегда использует псевдонимы таблиц в операциях выбора столбцов, и
  • , имеющий стандарт для имен параметров, что делает их менее вероятными столкнуться, например. P_PARAM.
+0

Параметр здесь, это имя столбца, а также единственный параметр IN для процедуры. Когда пользователь дает имя столбца, процедура должна возвращать все отдельные значения, присутствующие в этом конкретном столбце. –

Смежные вопросы