оператор не выполняется с помощью Execute Immediate в Oracle - PullRequest
0 голосов
/ 07 ноября 2019

Следующая инструкция выполняется в обычном исполнении, но при использовании EXECUTE IMMEDIATE результат не возвращается.

select distinct 
    FEEDBACKQUESTIONS.FeedbackQuestionId as id,
    FEEDBACKQUESTIONS.FeedbackQuestionId  
from FEEDBACKQUESTIONS 
left join LANGUAGES on FEEDBACKQUESTIONS.LanguageId = LANGUAGES.LanguageId  
where 
    1=1 
    and FEEDBACKQUESTIONS.CrdBy = 1 
order by 
    FEEDBACKQUESTIONS.FeedbackQuestionId desc 
    OFFSET 10 * (1 - 1) ROWS FETCH NEXT 10 ROWS ONLY

1 Ответ

0 голосов
/ 07 ноября 2019

Из Oracle Docs

Если dynamic_sql_statement является оператором SELECT, и вы опускаете оба параметра: в__клаве и в_темном_объекте, то execute_immediate_statement никогда не выполняется.

Вы используете предложение SELECT INTO и присваиваете значения некоторой переменной, если хотите увидеть результаты EXECUTE IMMEDIATE select values. Если ваш оператор select возвращает только одну строку, вы можете использовать следующую процедуру.

DECLARE P_CRDBY NUMBER := 1; 
V_ID VARCHAR2(20);
V_QID VARCHAR2(20);
BEGIN 
EXECUTE IMMEDIATE 'SELECT DISTINCT FEEDBACKQUESTIONS.FEEDBACKQUESTIONID AS ID,
                   FEEDBACKQUESTIONS.FEEDBACKQUESTIONID FROM FEEDBACKQUESTIONS 
                   LEFT JOIN LANGUAGES ON FEEDBACKQUESTIONS.LANGUAGEID = LANGUAGES.LANGUAGEID 
                   WHERE 1=1 AND FEEDBACKQUESTIONS.CRDBY = 1 
                   ORDER BY FEEDBACKQUESTIONS.FEEDBACKQUESTIONID DESC 
                   OFFSET 10 * (1 - 1) ROWS FETCH NEXT 10 ROWS ONLY' 
                   INTO V_ID,V_QID ; 
                   --USING P_CRDBY; DBMS_OUTPUT.PUT_LINE(P_CRDBY); 
 DBMS_OUTPUT.PUT_LINE('ID=' || V_ID ||', ID2=' || V_QID);
 END;

Для нескольких строк вы можете использовать FOR LOOP CURSOR для циклического просмотра набора результатов.

DECLARE P_CRDBY NUMBER := 1; 
V_ID VARCHAR2(20);
V_QID VARCHAR2(20);
BEGIN 
FOR MYROW IN (SELECT DISTINCT FEEDBACKQUESTIONS.FEEDBACKQUESTIONID AS ID,
                   FEEDBACKQUESTIONS.FEEDBACKQUESTIONID AS ID2 FROM FEEDBACKQUESTIONS 
                   LEFT JOIN LANGUAGES ON FEEDBACKQUESTIONS.LANGUAGEID = LANGUAGES.LANGUAGEID 
                   WHERE 1=1 AND FEEDBACKQUESTIONS.CRDBY = 1 
                   ORDER BY FEEDBACKQUESTIONS.FEEDBACKQUESTIONID DESC 
                   OFFSET 10 * (1 - 1) ROWS FETCH NEXT 10 ROWS ONLY) 
 --USING P_CRDBY; DBMS_OUTPUT.PUT_LINE(P_CRDBY); 
LOOP                
    DBMS_OUTPUT.PUT_LINE('ID=' || MYROW.ID||', ID2=' || MYROW.ID2);
END LOOP;
END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...