Нужна помощь в создании процедуры для загрузки данных в файл CSV с помощью plsql - PullRequest
0 голосов
/ 03 июля 2018

У меня есть три таблицы, как показано ниже.

Create table t1_Fact ( Cur_date Date, Name varchar2(10), Event varchar2(50), Price Number(10,0), TAX Number(10,0), Flag Number );
Create table App_Fact ( Application_ID Number, Application_Name varchar2(100), Application_Price Number, Appliation_Tax Number, Flag Number );
Create table t2 ( Table_Name Varchar2(100), Table_Columns Varchar(100), Table_Measure varchar2(100), t3_columns varchar2(100), t3_measures varchar2(100), t3_Where_Clause varchar2(100) );
Create table t3 ( Cur_date Date, Name varchar2(10), Event varchar2(50), Application_ID Number, Application_Name varchar2(100), Application_Price Number, Appliation_Tax Number, Price Number(10,0), TAX Number(10,0), Flag Number );

таблица t2 содержит все имена таблиц, имена столбцов каждой исходной и целевой таблиц и условия условия where. [t2 Подробности] [1]

Здесь мне нужно вставить данные из t3 в конкретную таблицу фактов, используя группу по именам столбцов таблицы фактов, мерам и выражению where, передавая имя таблицы фактов в качестве параметра.

Как если бы мы передавали таблицу t1_Fact в процедуре, мы должны получить все детали из t2, получить детали из t3 и вставить в t1_Fact, а также сохранить их в CSV-файле

Я пробовал следующую процедуру, но я не могу вставить данные в CSV-файл

Create or Replace Procedure CommonProcedure(sourceTableName IN VARCHAR2) Is
  tablename t2.Table_Name%TYPE;
  destcolumns t2.Table_Columns%TYPE;
  destMeasures t2.Table_Measure%TYPE;
  whereClause t2.t3_Where_Clause%TYPE;
  sourceColumns t2.t3_columns%TYPE;
  sourceMeasures t2.t3_measures%TYPE;
  q1 VARCHAR2(3000 BYTE);
  pathInfo VARCHAR2(3000 BYTE);

   v_file  UTL_FILE.FILE_TYPE;

 Cursor TableName Is  SELECT Table_Name FROM t2;

Begin

--Path will be getting from another table using the function in the format of '/data/Oracle-files/Table_CSV'

pathInfo := getDBConfigParamValue('FILE_LOCATION');

 Open c1;
 Loop
   Fetch TableName Into tablename;
   Exit When TableName%notfound;

    SELECT Table_Columns, Table_Measure, t3_columns, t3_measures INTO destcolumns,destMeasures,sourceColumns,sourceMeasures FROM t2 where Table_Name = tablename;

    q1 := 'INSERT INTO '||tablename||'('||destColumns||','||destMeasures||')'||
        ' ( SELECT '||sourceColumns||','||sourceMeasures||','||sourceTableName
          ||' FROM '||sourceTableName||' GROUP BY '||sourceColumns||')';

    Execute Immediate q1;



    --Need to load the data into  tablename.CSV

    v_file := UTL_FILE.FOPEN('' || pathInfo ||',' ||destinationTableName ||'.csv' || '','W');

    UTL_FILE.PUT_LINE(v_file,'' ||destColumns ||',' ||destMeasures ||'');

    UTL_FILE.FCLOSE(v_file);

 End Loop;

 Close TableName;

End;

Когда я компилирую вышеописанную процедуру, получаю следующую ошибку

LINE/COL ERROR
-------- -----------------------------------------------------------------
47/13    PL/SQL: Statement ignored
47/23    PLS-00306: wrong number or types of arguments in call to 'FOPEN'

Пожалуйста, помогите мне дальше.

Заранее спасибо.

1 Ответ

0 голосов
/ 03 июля 2018

PLS-00306: неверный номер или типы аргументов при вызове 'FOPEN'

Ваш fopen вызов передает только два аргумента; вы объединяете запятую в первое значение, а не используете ее в качестве разделителя аргументов, поэтому вы передаете сконструированную строку '<pathInfo>,<destinationTableName>.csv' в качестве местоположения, 'W' в качестве имени файла и не используете третий аргумент для открытого режима.

Вы можете увидеть проблему, если я выделю ее:

v_file := UTL_FILE.FOPEN('' || pathInfo ||',' ||destinationTableName ||'.csv' || '','W');
                                        ^^^^^^^^

Продолжая свой паттерн конкатенации пустых строк (?), Вы видите неправильную сторону заключительной цитаты:

v_file := UTL_FILE.FOPEN('' || pathInfo ||'', destinationTableName ||'.csv' || '','W');

или, может быть, даже:

v_file := UTL_FILE.FOPEN('' || pathInfo ||'', '' || destinationTableName ||'.csv' || '','W');

но вам не нужно делать всю эту запутанную конкатенацию, вы можете просто сделать:

v_file := UTL_FILE.FOPEN(pathInfo, destinationTableName ||'.csv', 'W');
...