Объявление курсора в хранимой процедуре PL / SQL - PullRequest
0 голосов
/ 10 июля 2020

printf ('local_time_greeting');

Проблемы с запуском хранимой процедуры с помощью SQL Developer. Ниже приведен пример, составленный точно так же, как первые несколько строк, с измененными именами переменных из соображений безопасности.

CREATE OR REPLACE PROCEDURE redacted ( an_in_variable IN VARCHAR ) AS
    these VARCHAR;
    variables VARCHAR;
    don_apostrophe_t INT;
    matter INT;
BEGIN

DECLARE cursor_giving_me_trouble CURSOR FOR
SELECT something FROM db.table WHERE condition_1 = condition_2;
...

В редакторе слово SELECT выделено красной волнистой линией, и когда я пытаюсь запустить код вывод возвращает

PLS-00103: Encountered symbol "FOR" when expecting one of the following     := . ( @ % ; not null range default character

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 11 июля 2020

Для начала:

create or replace procedure redacted
    ( an_in_variable in varchar2 )
as
    these varchar2(123);
    variables varchar2(456);
    don_apostrophe_t integer;
    matter integer;
    cursor cursor_giving_me_trouble is
        select 'Welcome to PL/SQL' as whatever from dual where 1=1;
begin
    for r in cursor_giving_me_trouble loop
        dbms_output.put_line(r.whatever);
    end loop;
end;

Однако вам часто не требуется отдельное определение курсора, поскольку существует такой компактный синтаксис:

create or replace procedure redacted
    ( an_in_variable in varchar2 )
as
    these varchar2(123);
    variables varchar2(456);
    don_apostrophe_t integer;
    matter integer;
begin
    for r in (
        select 'Welcome to PL/SQL' as whatever from dual where 1=1
    )
    loop
        dbms_output.put_line(r.whatever);
    end loop;
end;
0 голосов
/ 10 июля 2020

Вам нужно использовать IS, а не FOR, но у вас также есть термины определения в неправильном порядке:

DECLARE
  CURSOR cursor_giving_me_trouble IS
    SELECT something FROM db.table WHERE condition_1 = condition_2;

db <> fiddle который по-прежнему ошибается из-за неправильных имен объектов в вашем запутанном коде, но не из-за синтаксиса; и более полный пример .

Также возможно, что вы пытаетесь использовать конструкцию:

FOR cursor_giving_me_trouble IN (
    SELECT something FROM db.table WHERE condition_1 = condition_2
) LOOP
...

, а не подблок (новое объявление, за которым следует начало / конец) со ссылками только на курсор внутри него. db <> скрипка .

...