Объявление переменной типа PL / SQL% представляет внутреннее соединение - PullRequest
0 голосов
/ 10 января 2019

Как в моем скрипте PL / SQL как объявить JUSTIFIC_REC, когда он представляет соединение?

 SELECT * 
 INTO JUSTIFIC_REC
 FROM TABLE1 A  
 INNER JOIN TABLE2 B 
 ON A.ID_JUSTIFIC = B.ID_JUSTIFIC ;

Все, что я хочу, - это вставить в TABLE3 объединенную строку:

 INSERT INTO MOF_OUTACCDTL_REQ VALUES(
    JUSTIFIC_rec.ENTRY_COMMENTS || '   ' || JUSTIFIC_rec.DESCRIPTION );

Как должно выглядеть объявление JUSTIFIC_REC в начале моего сценария?

Если бы не ВНУТРЕННЕЕ СОЕДИНЕНИЕ, я бы написал что-то вроде: JUSTIFIC_rec TABLE1% ROWTYPE;

Ответы [ 4 ]

0 голосов
/ 10 января 2019

Ответ на ваш вопрос сам по себе в вашем вопросе. Вы должны использовать тип строки% Атрибут типа буксировки может быть любого из следующих типов:

rowtype_attribute :=
 {cursor_name | cursor_variable_name | table_name} % ROWTYPE

cursor_name: - Явный курсор, ранее объявленный в текущей области видимости.

cursor_variable_name: - Переменная курсора со строгим типом PL / SQL, ранее объявленная в текущей области видимости.

table_name: - Таблица базы данных или представление, которое должно быть доступно при разработке объявления.

Так код будет выглядеть как

    DECLARE
         CURSOR c1 IS
          SELECT *  FROM TABLE1 A  
     INNER JOIN TABLE2 B 
     ON A.ID_JUSTIFIC = B.ID_JUSTIFIC ;
           justific_rec c1%ROWTYPE;


   BEGIN
      open c1;
loop
    fetch c1 into justific_rec;
    exit when c1%notfound;
     INSERT INTO MOF_OUTACCDTL_REQ VALUES(
JUSTIFIC_rec.ENTRY_COMMENTS || '   ' || JUSTIFIC_rec.DESCRIPTION );
end loop;
close c1;
    END;
    /
0 голосов
/ 10 января 2019

Если я правильно понял, вы можете попробовать с типом курсора следующим образом (не уверен, что это то, что вы имели в виду, объявив тип переменной для выбора с объединениями):

set serveroutput on;
declare

cursor cur is 
 SELECT ENTRY_COMMENTS, DESCRIPTION   
 FROM TABLE1 A  
 INNER JOIN TABLE2 B 
 ON A.ID_JUSTIFIC = B.ID_JUSTIFIC ;

justific_rec cur%ROWTYPE;

begin

open cur;
loop
    fetch cur into justific_rec;
    exit when cur%notfound;
    dbms_output.put_line(justific_rec.entry_comments || ' ' || justific_rec.description);
end loop;
close cur;

end;
0 голосов
/ 10 января 2019

Если все, что вы хотите сделать, это вставить в таблицу, основанную на операторе select, тогда PL / SQL не нужен (под этим я подразумеваю, что нет необходимости открывать курсор, извлекать строку, обрабатывать строку и затем переходите к следующему ряду) - это строка за строкой или медленная обработка.

Вместо этого вы можете сделать все это в одном операторе вставки, например ::10000

INSERT INTO mof_outaccdtl_rec (<column being inserted into>) -- please always list the columns being inserted into; this avoids issues with your code when someone adds a column to the table.
SELECT entry_comments || '   ' || description -- please alias your columns! How do we know which table each column came from?
FROM   table1 a
       inner join table2 b on a.id_justific = b.id_justific;

Если вы хотите встроить этот оператор вставки в PL / SQL, все, что вам нужно сделать, это добавить начало / конец вокруг него, например:

begin
  INSERT INTO mof_outaccdtl_rec (<column being inserted into>) -- please always list the columns being inserted into; this avoids issues with your code when someone adds a column to the table.
  SELECT entry_comments || '   ' || description -- please alias your columns! How do we know which table each column came from?
  FROM   table1 a
         inner join table2 b on a.id_justific = b.id_justific;
end;
/

Это предпочтительное решение при работе с базами данных - думать в наборах (где это возможно), а не процедурно (построчно). Его легче поддерживать, код проще читать и писать, и он будет более производительным, поскольку вам не придется переключаться между PL / SQL и SQL несколько раз с каждой строкой.

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

0 голосов
/ 10 января 2019

Вам нужно использовать BULK COLLECT INTO

 SELECT * 
 BULK COLLECT INTO JUSTIFIC_REC
 FROM TABLE1 A  
 INNER JOIN TABLE2 B 
 ON A.ID_JUSTIFIC = B.ID_JUSTIFIC ; 

JUSTIFIC_REC необходим для типа TABLE с соответствующими столбцами

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