Невозможно присвоить значение из таблицы перед объявлением курсора в db2

Я не могу присвоить значение локальной переменной из операторов выбора. Пожалуйста помоги мне с этим.

Я хочу присвоить значение локальной переменной перед объявлением курсора. Я хочу использовать это значение локальной переменной в операторе выбора курсора.

пробовали код ниже

CREATE OR REPLACE PROCEDURE TESTPROC(IN STARTKEY BIGINT, IN ENDKEY BIGINT)
BEGIN
DECLARE v_var1 VARCHAR(100);
SELECT status into v_var1 from emp where emp_id=1000; -- this will return only one value
DECLARE C_CURSOR CURSOR WITH HOLD FOR SELECT emp_code from company where status=v_var1;
OPEN C_CURSOR;
    FETCH PV INTO C_CURSOR;
    --
    --
    -- My logic 
CLOSE C_CURSOR;
END
@

поместить курсор в ...

jarlh 10.09.2018 10:48

Почему бы просто не добавить это первое предложение в свой выбор? SELECT emp_code from company join emp on emp.status=company.status where emp_id=1000

TomC 10.09.2018 11:23
0
2
169
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Попробуй это

CREATE OR REPLACE PROCEDURE TESTPROC(IN STARTKEY BIGINT, IN ENDKEY BIGINT)
language sql
specific testproc
BEGIN
    DECLARE v_var1 VARCHAR(100);
    DECLARE v_sql VARCHAR(1024);
    DECLARE v_emp_code bigint;
    DECLARE C_CURSOR CURSOR WITH HOLD FOR s1;
    SELECT status into v_var1 from emp where emp_id=1000; -- this will return only one value
    set v_sql ='SELECT emp_code from company where status = '''||v_var1||'''' ;

    PREPARE s1 from v_sql;
    OPEN C_CURSOR;
    FETCH C_CURSOR into v_emp_code;
    --
    --
    -- My logic 
    CLOSE C_CURSOR;
END
@

Просто измените свой запрос следующим образом

SELECT f1.emp_code from company f1 
inner join emp f2 on f1.status=f2.status and f2.emp_id=1000;

Вы можете попробовать использовать вложенные блоки BEGIN / END для присвоения значения переменной, прежде чем использовать ее в курсоре. (Это работает в других RBDMS).

CREATE OR REPLACE PROCEDURE TESTPROC(IN STARTKEY BIGINT, IN ENDKEY BIGINT)
BEGIN -- Parent block
 DECLARE v_var1 VARCHAR(100);

 BEGIN -- Child block 1
  SELECT status into v_var1 from emp where emp_id=1000;
 END;

 BEGIN -- Child block 2
  DECLARE C_CURSOR CURSOR WITH HOLD FOR SELECT emp_code FROM company WHERE status = v_var1;
  OPEN C_CURSOR;
    FETCH PV INTO C_CURSOR;
    -- Your logic ...
  CLOSE C_CURSOR;
 END;

END
@

Другие вопросы по теме