Как создать процедуру с указанием c SQL Выбрать вывод в Oracle? - PullRequest
0 голосов
/ 29 апреля 2020

Я использую базу данных Oracle, и в настоящее время у меня возникла проблема с созданием Procdure, который должен создать несколько SQL SELECT Outputs. Процедура была успешно завершена, но я не получаю вывод.

Вот мое текущее решение, но я не получаю некоторый вывод:

DECLARE
  PROCEDURE myProcedure(schema IN VARCHAR2) AS
    BEGIN
        FOR myCur IN (
                       WITH p AS (SELECT 'myFirstOldSchema'  AS OLD_SCHEMA,'myFirstNewSchema'  AS NEW_SCHEMA FROM DUAL UNION
                                  SELECT 'mySecondOldSchema' AS OLD_SCHEMA,'mySecondNewSchema' AS NEW_SCHEMA FROM DUAL UNION
                                  SELECT 'myThirdOldSchema'  AS OLD_SCHEMA,'myThirdNewSchema'  AS NEW_SCHEMA FROM DUAL
                       )
                       SELECT p.*
                       FROM p
                       WHERE p.old_schema = schema)
        LOOP     
            EXECUTE IMMEDIATE 
            'SELECT '''|| myCur.old_schema ||''' AS SCHEMA_NAME, 'TEST_1' AS SOME_TESTOUTPUT, TO_CHAR(SELECT COUNT(*) FROM '|| old_schema||'.myFirstTable ))  AS TABLE_CONTENT FROM dual UNION
            'SELECT '''|| myCur.old_schema ||''' AS SCHEMA_NAME, 'TEST_2' AS SOME_TESTOUTPUT, TO_CHAR(SELECT COUNT(*) FROM '|| old_schema||'.mySecondTable )) AS TABLE_CONTENT FROM dual UNION
            'SELECT '''|| myCur.old_schema ||''' AS SCHEMA_NAME, 'TEST_3' AS SOME_TESTOUTPUT, TO_CHAR(SELECT COUNT(*) FROM '|| old_schema||'.myThirdTable ))  AS TABLE_CONTENT FROM dual';
        END LOOP;
  END myProcedure;

BEGIN
  FOR S IN (SELECT * FROM ROOT_SCHEMA.myTableWithSchema)
  LOOP        
    -- First  loop S.mySchemata represent the value 'myFirstOldSchema'
    -- Second loop S.mySchemata represent the value 'mySecondOldSchema'
    -- Third  loop S.mySchemata represent the value 'myThirdOldSchema'
    myProcedure(S.mySchemata);
  END LOOP

END;

Мне нужен выходной результат примерно так ( в лучшем случае сортируется по столбцу SCHEMA_NAME):

   SCHEMA_NAME    | SOME_TESTOUTPUT | TABLE_CONTENT 
---------------------------------------------------
myFirstOldSchema  |      TEST_1     |     90
---------------------------------------------------
mySecondOldSchema |      TEST_2     |     77
---------------------------------------------------
myThirdOldSchema  |      TEST_3     |     36

Как решить эту проблему? Нужно работать с некоторыми временными переменными и другим курсором? И можно дополнить SQL SELECT Statments предложением ORDER BY в конце?

Большое спасибо за помощь!

1 Ответ

2 голосов
/ 29 апреля 2020

Возможно, процедура, которая возвращает sys_refcursor, будет лучшей идеей. Потому что, если вы динамически (execute immediate) делаете некоторые выборки, эти результаты должны где-то храниться.

Это простой пример, но он может дать вам представление.

SQL> create or replace procedure p_test (par_rc out sys_refcursor) is
  2  begin
  3    open par_rc for
  4      select 'emp' table_name, count(*) from emp union all
  5      select 'dept'          , count(*) from dept union all
  6      select 'bonus'         , count(*) from bonus;
  7  end;
  8  /

Procedure created.

SQL> var rc refcursor
SQL> exec p_test(:rc);

PL/SQL procedure successfully completed.

SQL> print rc

TABLE_NAME   COUNT(*)
---------- ----------
emp                14
dept                4
bonus               0

SQL>
...