Почему оператор SELECT не отображает таблицу во время исполнения в Oracle? - PullRequest
0 голосов
/ 23 октября 2019

Я новичок в Oracle. У меня уже есть таблица tempash. Итак, я создал процедуру, чтобы увидеть данные этой таблицы. Итак, я создал процедуру как:

create or replace procedure offc.temp_sel(data1 varchar2) is
   var1 varchar2(4000);
BEGIN
 var1:='select * from  offc.temp'||data1;
   EXECUTE IMMEDIATE var1;
 end;

Итак, я выполнил оператор, но он ничего мне не показывает.

 exec offc.temp_sel('ash');

В моей процедуре нет ошибки компиляции. Но почему оператор select не показывает мне данные этой процедуры?

Ответы [ 2 ]

1 голос
/ 23 октября 2019

Попробуйте добавить выходной параметр :

create or replace procedure offc.temp_sel(data1 varchar2,result out sys_refcursor) 
is

BEGIN

 open result for 'select * from  offc.temp'||data1;
 end;


SQL> var rc refcursor
SQL> execute offc.temp_sel('ash',:rc)

PL/SQL procedure successfully completed.

SQL> print rc
0 голосов
/ 24 октября 2019

Вам необходимо сохранить результат оператора SELECT в переменной. Когда вы выполняете SELECT * ..., вы должны поместить результат в тип RECORD, но, поскольку набор результатов содержит более 1 строки, ваша переменная должна быть таблицей записей.

Чтобы неБудьте подвержены ошибкам, таблицы записей должны быть точно такими же, как ваша исходная структура таблицы.

CREATE OR REPLACE PROCEDURE OFFC.TEMP_SEL(DATA1 VARCHAR2) IS

    VAR1 VARCHAR2(4000);

    TYPE T_RESULT IS TABLE OF offc.temp%ROWTYPE;
--  defined the new type based on the structure of table TEMP from schema OFFC

    v_result t_result;
--  define a variable of that type.

BEGIN
    var1:='select * from  offc.temp'||data1;

    EXECUTE IMMEDIATE VAR1 BULK COLLECT INTO V_RESULT;
--  collect he result into the new variable

    FOR I IN 1 ..v_result.count
    LOOP
        dbms_output.put_line(v_result(i).<<column_name from temp offc.table>>);
    end loop;
--  loop through the variable(table of records) and display its content.
--  you need to replace the  << ... >> with the name of your column from source tabel that you want to display.

 end;

Для выполнения процедуры вы должны использовать:

set serveroutput on;
execute temp_sel( 'ash');

Best, Mikcutu

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...