Oracle ошибка при выборе во временную таблицу - PullRequest
0 голосов
/ 16 января 2020

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

DECLARE
    type L1_store is table of MyTable%rowtype;
    L1 L1_store;
BEGIN
    select
        * bulk collect
    into L1
    from MyTable
    WHERE 1=1
    and length(MyColumn1) = 2;

    select 
        L1.MyColumn1 
        ,L1.MyColumn2
    from L1;
END;

И вот ошибка, которую я получаю;

ORA-06550: line 19, column 6:
PL/SQL: ORA-00942: table or view does not exist
ORA-06550: line 16, column 1:
PL/SQL: SQL Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

Номера строк могут быть неправильными, так как я редактировал фактический PL / SQL для ясности

**** РЕДАКТИРОВАТЬ ****

ОК, поэтому я изначально принял ответ, предложенный ниже, так как похоже, что он отвечает на мой вопрос, и я вижу, как я мог бы использовать Это. Однако, для ясности, вот моя конечная цель, в случае, если есть лучший ответ, чем тот, который у меня в голове.

Если бы я просто делал это в SQL, я бы сделал что-то вроде

with L1 as
(select * from table),
L2 as 
(select * from anothertable)

select L1.Column
from L1
left join L2 on L1.somecolumn = L2.somecolumn

Я не знаю, помогает ли это или мешает, но спасибо всем в ожидании вашего дальнейшего терпения.

Ответы [ 2 ]

1 голос
/ 16 января 2020

type L1_store is table of MyTable%rowtype; не является временной таблицей ; это тип данных коллекции, объявленный в области PL / SQL, и его нельзя использовать в области SQL. Точно так же %ROWTYPE является конструкцией PL / SQL.

Если вы хотите использовать коллекцию в SQL, объявите ее в области действия SQL:

CREATE TYPE mytable_data is OBJECT (
  mycolumn1 VARCHAR2(50),
  mycolumn2 NUMBER,
  mycolumn3 DATE
);

CREATE TYPE mytable_data_table IS TABLE OF mytable_data;

поэтому для некоторых тестовых данных:

CREATE TABLE MyTable(
  mycolumn1 VARCHAR2(50),
  mycolumn2 NUMBER,
  mycolumn3 DATE
);

INSERT INTO MyTable VALUES ( 'AA', 42, SYSDATE );

Затем вы можете сделать:

DECLARE
    L1 mytable_data_table;
BEGIN
    select mytable_data( mycolumn1, mycolumn2, mycolumn3 )
    bulk collect into L1
    from  MyTable
    WHERE length(MyColumn1) = 2;

    FOR i IN 1 .. L1.COUNT LOOP
      DBMS_OUTPUT.PUT_LINE( L1(i).mycolumn1 || ' ' || l1(i).mycolumn2 );
    END LOOP;
END;
/

Какие выходы:

AA 42

дБ <> скрипка здесь

1 голос
/ 16 января 2020

Проблема здесь, кажется, второй выбор в блоке. Если вы пытаетесь выбрать данные из записи, я был бы склонен поместить их в FOR l oop. То есть что-то вроде этого:

for i in 1 .. L1.count() LOOP
   dbms_output.put_line (L1(i).MyColumn1);
end loop;

Вы можете присвоить значение MYColumn1 переменной или использовать его другим способом.

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