Путаница об использовании типов вместо GTTS в Oracle

StackOverflow https://stackoverflow.com/questions/3036948

  •  27-09-2019
  •  | 
  •  

Вопрос

Я пытаюсь преобразовать запросы, как приведенные ниже, чтобы они не придется использовать GTT:

insert into my_gtt_table_1
(house, lname, fname, MI, fullname, dob)
(select house, lname, fname, MI, fullname, dob 
 from (select 'REG' house, mbr_last_name lname, mbr_first_name fname, mbr_mi MI, 
       mbr_first_name || mbr_mi || mbr_last_name fullname, mbr_dob dob from 
       table_1 a, table_b
       where a.head = b.head and mbr_number = '01' and mbr_last_name = v_last_name) c

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

create or replace type lname_row as object
    (
     house varchar2(30)
     lname varchar2(30),
     fname varchar2(30),
     MI char(1),
     fullname VARCHAR2(63),
     dob DATE
     )

create or replace type lname_exact as table of lname_row 

Сейчас в СП:

type lname_exact is table of <what_table_should_i_put_here>%rowtype;
tab_a_recs lname_exact;

В приведенном выше я не уверен, какой стол положить в качестве моего запроса, появился вложенные подзапросы.

Запрос в SP: (Я пробую это для образца цели, чтобы увидеть, работает ли это)

        select lname_row('',
                                '',
                                '',
                                '',
                                '',
                                '',
                                sysdate) bulk collect
          into tab_a_recs
        from table_1;

Я получаю ошибки, такие как: ORA-00913: слишком много ценностей

Я действительно запутался и застрял с этим :(

Это было полезно?

Решение

Вы определили тип с 6 атрибуты, и вы пытаетесь создать его с 7 значения. Попробуйте это вместо этого:

    select lname_row(/*'',*/
                     '',
                     '',
                     '',
                     '',
                     '',
                     sysdate) bulk collect
      into tab_a_recs
    from table_1;

РедактироватьТам, кажется, имеется путаница относительно типов. В Oracle вы можете определить типы в SQL или в PL / SQL. Типы SQL являются доступными к SQL (!) В то время как PL / SQL предлагают некоторые дополнительные функции, но невидимы для чистого SQL (PL / SQL также могут получить доступ к типам SQL).

Это говорит, он запутается и неразумно, чтобы назвать типы одинаково как в SQL, так и в PL / SQL (вы работаете в тень вопросы). Вы определены lname_exact Введите два раза (с вашим оператором Create и в своем блоке объявлений). Так как вы создаете lname_exact В операторе SQL тип выбранного в этом случае является типом SQL (только с 6 атрибутами).

Вы должны либо удалить декларацию lname_exact на SP или переименовать его.

Другие советы

В дополнение к отличному ответу Винсента: вам не нужно явно создавать lname_row в вашем запросе SQL. Объемная сборка автоматически сопоставляет столбцы, выбранные с полями в цель. Таким образом, основываясь на том, что вы показали до сих пор, вам не нужно создавать типы на уровне схемы, вам просто нужно определить их в вашем блоке PL / SQL.

Вот простой пример, который работает:

SQL> l
  1  declare
  2    type my_row is record (x number, y date);
  3    type my_tab is table of my_row;
  4    a_table  my_tab;
  5  begin
  6  select 1,sysdate
  7      bulk collect into a_table
  8      from dual;
  9  dbms_output.put_line(a_table(1).y);
 10* end;
SQL> /
14-JUN-10
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top