Возврат результатов запроса внутри скрипта PL / SQL - PullRequest
0 голосов
/ 21 октября 2019

Возможно ли, что инструкция SELECT внутри блока PL / SQL будет возвращать записи таблицы, как при выполнении запроса SELECT стандартным способом?

Я имею в виду, почему код:

DECLARE
    sql_qry     VARCHAR2 (150);
BEGIN

    sql_qry:= 'SELECT ''1'' FROM dual';
    EXECUTE IMMEDIATE sql_qry;
END;
/

после выполнения execusionтолько информация: PL/SQL procedure successfully completed.

Возможно ли, что оператор SELECT, заключенный в блок PL / SQL, будет вести себя так же, как при выполнении:

SELECT '1' FROM dual;

1 Ответ

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

Если вы используете Oracle 12c и выше, вы можете использовать DBMS_SQL.RETURN_RESULT

Для 11g вы можете использовать эту стандартную процедуру

create or replace procedure return_result( l_query varchar2 )
   is
       l_theCursor     integer default dbms_sql.open_cursor;
       l_columnValue   varchar2(4000);
       l_status        integer;
       l_colCnt        number := 0;
       l_separator     varchar2(1);
       l_descTbl       dbms_sql.desc_tab;
   begin
       dbms_sql.parse(  l_theCursor,  l_query, dbms_sql.native );

       dbms_sql.describe_columns( l_theCursor, l_colCnt, l_descTbl );


           l_separator := '';
           for i in 1 .. l_colCnt loop
               dbms_output.put( l_separator || l_descTbl(i).col_name );
               l_separator := ',';
           end loop;
           dbms_output.put_line('');

        for i in 1 .. l_colCnt loop
           dbms_sql.define_column( l_theCursor, i, l_columnValue, 4000 );
       end loop;
       l_status := dbms_sql.execute(l_theCursor);

       while ( dbms_sql.fetch_rows(l_theCursor) > 0 ) loop
           l_separator := '';
           for i in 1 .. l_colCnt loop
               dbms_sql.column_value( l_theCursor, i, l_columnValue );
               dbms_output.put( l_separator || l_columnValue );
               l_separator := ',';
           end loop;
           dbms_output.new_line;
       end loop;
       dbms_sql.close_cursor(l_theCursor);
   end;
/

Назовите ее как

set serveroutput on 
EXECUTE return_result('SELECT ''1'' as col FROM dual');

Res

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