我正在嘗試將值批量收集到集合中。我得到ORA-00904: "PREV_VAL_R" invalid identifier。代碼已簡化。
PROCEDURE MY_HELPER() IS
----------------------------------------------------------------
TYPE PREV_VAL_R IS RECORD(
DESC1 VARCHAR2(250),
MONTH_VAL VARCHAR2(250),
MONTH_ALL VARCHAR2(250));
TYPE PREV_VAL_T IS TABLE OF PREV_VAL_R;
BEGIN
SELECT PREV_VAL_R(DESC1, MONTH_VAL, MONTH_ALL)
BULK COLLECT INTO PREV_VAL_T
FROM MY_TABLE;
END MY_HELPER;
我究竟做錯了什么?謝謝!
uj5u.com熱心網友回復:
您PREV_VAL_R()作為物件建構式呼叫,但這是 PL/SQL 記錄型別,而不是 SQL 級別的已知內容。
您可以將列直接批量收集到您的記錄表中??;盡管它需要是該集合型別的實體,而不是型別本身,例如:
PROCEDURE MY_HELPER() IS
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
TYPE PREV_VAL_R IS RECORD(
DESC1 VARCHAR2(250),
MONTH_VAL VARCHAR2(250),
MONTH_ALL VARCHAR(250));
TYPE PREV_VAL_T IS TABLE OF PREV_VAL_R;
L_PREV_VAL_T PREV_VAL_T;
BEGIN
SELECT DESC1, MONTH_VAL, MONTH_ALL
BULK COLLECT INTO L_PREV_VAL_T
FROM MY_TABLE;
END MY_HELPER;
我已經添加L_PREV_VAL_T PREV_VAL_T;到申報征收的情況下,和在INTO PREV_VAL_T以INTO L_PREV_VAL_T定位到該實體。(當然,您可以/應該使用更有意義的名稱...)
資料庫<>小提琴
uj5u.com熱心網友回復:
Typeprev_val_r是一個普通的舊 PL/SQL 記錄型別,而不是帶有建構式的物件型別。您可以只列出專案,而無需任何建構式。
此外,prev_val_t是一種型別,因此您仍然需要該型別的變數。我t在下面的例子中命名了我的:
create or replace procedure my_helper
as
type prev_val_r is record(
desc1 varchar2(250)
,month_val varchar2(250)
,month_all varchar2(250));
type prev_val_t is table of prev_val_r;
t prev_val_t;
begin
select 'x', 'y', 'z' bulk collect into t from dual;
end my_helper;
21c 的PL/SQL 記錄型別的限定運算式類似于物件建構式,因此您可以撰寫例如
r prev_val_r := prev_val_r('x', 'y', 'z');
但它們僅用于 PL/SQL 而不是 SQL。據推測,PL/SQL 編譯器在內部為您構建代碼,因此它只是語法糖,這就是 Oracle 小心避免將其稱為建構式的原因。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/388830.html
