目前面臨以下錯誤,我覺得應該是一個簡單的陳述。
PL/SQL:ORA-00984:此處不允許列
我試圖插入的表就像這樣簡單:
CREATE TABLE "DB"."TABLE"
(
"ID" NUMBER(*,0),
"TEMPLATE_ID" NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY MINVALUE 1 MAXVALUE 99999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER NOCYCLE NOKEEP NOSCALE ,
"TEMPLATE_NAME" VARCHAR2(256 BYTE)
) SEGMENT CREATION IMMEDIATE;
然后我有一個試圖INSERT進入這個表的存盤程序:
INSERT INTO "DB"."TABLE"
VALUES (ID, NULL, V_TEMPLATE_NAME);
為什么不允許這樣做?還有什么方法可以使用存盤程序插入具有標識列的表中?
我還嘗試更新我的存盤程序,從插入中洗掉標識列(如下所示),它會導致相同的錯誤:
INSERT INTO "DB"."TABLE" (ID, TEMPLATE_NAME)
VALUES (V_ID, V_TEMPLATE_NAME);
uj5u.com熱心網友回復:
V_ID如果未宣告或未V_TEMPLATE_NAME宣告或在范圍內,您將收到該錯誤。使用匿名塊,并使用跳過生成列的版本:
BEGIN
INSERT INTO "TABLE" (ID, TEMPLATE_NAME)
VALUES (V_ID, V_TEMPLATE_NAME);
END;
/
ORA-06550: line 3, column 17:
PL/SQL: ORA-00984: column not allowed here
ORA-06550: line 2, column 3:
PL/SQL: SQL Statement ignored
但是如果宣告了變數,它就可以作業:
DECLARE
V_ID NUMBER;
V_TEMPLATE_NAME VARCHAR2(30);
BEGIN
INSERT INTO "TABLE" (ID, TEMPLATE_NAME)
VALUES (V_ID, V_TEMPLATE_NAME);
END;
/
1 rows affected
它也適用于您的第一條陳述句,因為您生成的列具有 thenon null子句:
DECLARE
V_ID NUMBER;
V_TEMPLATE_NAME VARCHAR2(30);
BEGIN
INSERT INTO "TABLE"
VALUES (V_ID, NULL, V_TEMPLATE_NAME);
END;
/
1 rows affected
盡管列出列名仍然是更好的做法。
小提琴
大概在您的程式中,那些將是形式引數名稱,但原理是相同的;可能你只是在某個地方有錯字。
在您發布的第一條宣告中,您實際上擁有:
VALUES (ID, NULL, V_TEMPLATE_NAME);
與ID不V_ID。如果那是您真正正在運行的,那么即使您有一個V_ID變數,它也會失敗并出現相同的錯誤。正如您的第二個宣告V_ID一樣,目前尚不清楚其中一個或另一個在發布期間是否已更改。
無論哪種方式...您需要宣告變數(作為區域變數或程序引數)并使用正確的名稱參考它們。
(另請參閱有關靜態 SQL 名稱決議的檔案;缺少變數或名稱不匹配,它在第 5 步失敗。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/525258.html
標籤:sql甲骨文plsql
下一篇:區間值之和oracle
