Как преобразовать каждую Таблицу от указанного c Пользователя в JSON Формат, используя "трюк", предоставленный SQL Разработчиком - PullRequest
0 голосов
/ 23 января 2020

Я хочу преобразовать все таблицы из указанного c пользователя в JSON (или XML) формат. Я читал о "хитрости", упомянутой SQL Developer.

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

  • p_format: формат (в моем случае это будет "json")
  • p_user: имя пользователя

В качестве IDE я использую Oracle SQL Developer и моя база данных - Oracle База данных XE .

Сначала процедура зацикливается, хотя все таблицы данного пользователя и в l oop, должны выполнить следующее:

SELECT /*p_format*/ * FROM p_user || '.' || table

К сожалению, я не могу использовать это утверждение SELECT, как упомянуто выше. Мне нужно использовать команду EXECUTE IMMEDIATE <Statement>.

Следующая проблема, с которой я столкнулся, заключалась в следующем: я хотел вывести результат команды EXECUTE IMMEDIATE. Поэтому я использовал команду EXECUTE IMMEDIATE <Statement> INTO <Variable>. После компиляции процедуры и ее выполнения я наткнулся на следующую ошибку:

"inconsistent datatypes: expected %s got %s"

Это мой код процедуры:

CREATE OR REPLACE PROCEDURE EXPORT_TABLE_TO_FORMAT_FROM(p_format VARCHAR2, p_user VARCHAR2) IS
/***************************************************************************
        Author: 
        Class:  
        School: 
        Date:   

        Function - EXPORT_TABLE_TO_JSON_FROM(p_user):
        Displays the data of every table from a given User as JSON
        Parameter: p_user ... User
***************************************************************************/ 
v_tableData VARCHAR2(32767);
v_sqlStatement VARCHAR2(200);
BEGIN
  FOR tablerec IN (SELECT *
                   FROM   ALL_TABLES
                   WHERE OWNER = p_user)
  LOOP
    v_sqlStatement := 'SELECT /*' || p_format || '*/ * FROM ' || p_user || '.' || tablerec.TABLE_NAME;
    EXECUTE IMMEDIATE v_sqlStatement INTO v_tableData;

    DBMS_OUTPUT.PUT_LINE (v_sqlStatement);
  END LOOP;
END;

Вы видите, что я l oop хотя все таблицы данного пользователя и создали оператор sql с p_format и p_user и с tablerec.TABLE_NAME.

Желаемый результат должен выглядеть точно так:

{"results":[{"columns":[{"name":"COUNTRY_ID","type":"CHAR"},
{"name":"COUNTRY_NAME","type":"VARCHAR2"},{"name":"REGION_ID","type":"NUMBER"}],"items":
[
{"country_id":"AR","country_name":"Argentina","region_id":2},
{"country_id":"AU","country_name":"Australia","region_id":3},
{"country_id":"BE","country_name":"Belgium","region_id":1},
{"country_id":"BR","country_name":"Brazil","region_id":2},
{"country_id":"CA","country_name":"Canada","region_id":2},
{"country_id":"CH","country_name":"Switzerland","region_id":1},
{"country_id":"CN","country_name":"China","region_id":3},
{"country_id":"DE","country_name":"Germany","region_id":1},
{"country_id":"DK","country_name":"Denmark","region_id":1},
{"country_id":"EG","country_name":"Egypt","region_id":4},
{"country_id":"FR","country_name":"France","region_id":1},
{"country_id":"IL","country_name":"Israel","region_id":4},
{"country_id":"IN","country_name":"India","region_id":3},
{"country_id":"IT","country_name":"Italy","region_id":1},
{"country_id":"JP","country_name":"Japan","region_id":3},
{"country_id":"KW","country_name":"Kuwait","region_id":4},
{"country_id":"ML","country_name":"Malaysia","region_id":3},
{"country_id":"MX","country_name":"Mexico","region_id":2},
{"country_id":"NG","country_name":"Nigeria","region_id":4},
{"country_id":"NL","country_name":"Netherlands","region_id":1},
{"country_id":"SG","country_name":"Singapore","region_id":3},
{"country_id":"UK","country_name":"United Kingdom","region_id":1},
{"country_id":"US","country_name":"United States of America","region_id":2},
{"country_id":"ZM","country_name":"Zambia","region_id":4},
{"country_id":"ZW","country_name":"Zimbabwe","region_id":4}]}]}

1 Ответ

2 голосов
/ 24 января 2020

Подсказка JSON указывает c до SQL Developer и SQLcl, а не базу данных напрямую. Таким образом, вам нужно запустить все это в этих инструментах.

Самый простой способ сделать это - написать скрипт написать скрипт, который можно запустить, например,

spool /tmp/get_all_json.sql
select 'select /*json*/ * from '||table_name||';' 
from user_tables;
spool off
@/tmp/get_all_json.sql
...