PLSQL:ORA-00904 游标中的标识符无效 Select
PLSQL : ORA-00904 invalid identifier in Cursor Select
我已经 EXTERNAL TABLE
创建如下。
CREATE TABLE EXTERNAL_TABLE
( "col1" DATE
, "col2" DATE
) ORGANIZATION external
( TYPE oracle_loader
DEFAULT DIRECTORY INPUT_DIRECTORY
ACCESS PARAMETERS
( RECORDS DELIMITED BY NEWLINE
LOGFILE 'Some.log'
BADFILE 'Some.bad'
FIELDS TERMINATED BY "|" LDRTRIM
( "col1" DATE
, "col2" DATE MASK "MM/DD/YYYY"
)
)
LOCATION ('SomeDat.dat')
)
PARALLEL 1
REJECT LIMIT UNLIMITED
/
我正在将加载到外部 table 的数据填充到事务 table 中以供进一步处理。
PROCEDURE upload
IS
lv_post_dt DATE;
TYPE dataTblType IS TABLE OF My_Transaction_Table%ROWTYPE;
lv_dataTbl dataTblType;
CURSOR externalCur IS
SELECT lv_post_dt col1,
col2 --ORA-00904 invalid identifier is encountered here
FROM EXTERNAL_TABLE;
BEGIN
lv_post_dt := SYSTIMESTAMP;
OPEN externalCur;
LOOP
FETCH externalCur BULK COLLECT
INTO lv_dataTbl LIMIT 25000;
EXIT WHEN lv_dataTbl.COUNT = 0;
FOR i IN 1 .. lv_dataTbl.COUNT LOOP
--Insert recordsinto My_Transaction_Table
END LOOP;
CLOSE externalCur;
END upload;
下面我也试过了
CURSOR externalCur IS
SELECT lv_post_dt col1,
ext.col2 --ORA-00904 invalid identifier is encountered here
FROM EXTERNAL_TABLE ext;
CURSOR externalCur IS
SELECT lv_post_dt col1,
EXTERNAL_TABLE.col2 --ORA-00904 invalid identifier is encountered here
FROM EXTERNAL_TABLE;
即使 col2
属于 EXTERNAL_TABLE
,为什么我会收到无效标识符错误以及如何解决这个问题?
当我写 lv_post_dt col1
那么为什么它有效?
那是因为 不幸的是 双引号。你为什么使用它们?他们带来的只是问题。
这就是你所做的(忽略这不是外部的事实 table):
SQL> CREATE TABLE EXTERNAL_TABLE
2 ( "col1" DATE
3 , "col2" DATE
4 );
Table created.
你能select一切吗?当然:
SQL> select * from external_table;
no rows selected
你能select只col2
吗?并不真地;这是你的 ORA-00904: invalid identifier
:
SQL> select col2 from external_table;
select col2 from external_table
*
ERROR at line 1:
ORA-00904: "COL2": invalid identifier
为什么会这样?因为 双引号 。一旦你使用它们并在命名对象时混合(或小写)字母大小写,你必须每次都使用双引号并匹配字母大小写:
SQL> select "col2" from external_table;
no rows selected
SQL>
你应该怎么办?在我看来,删除 table 并重新创建它,但这次省略所有地方的双引号。
我已经 EXTERNAL TABLE
创建如下。
CREATE TABLE EXTERNAL_TABLE
( "col1" DATE
, "col2" DATE
) ORGANIZATION external
( TYPE oracle_loader
DEFAULT DIRECTORY INPUT_DIRECTORY
ACCESS PARAMETERS
( RECORDS DELIMITED BY NEWLINE
LOGFILE 'Some.log'
BADFILE 'Some.bad'
FIELDS TERMINATED BY "|" LDRTRIM
( "col1" DATE
, "col2" DATE MASK "MM/DD/YYYY"
)
)
LOCATION ('SomeDat.dat')
)
PARALLEL 1
REJECT LIMIT UNLIMITED
/
我正在将加载到外部 table 的数据填充到事务 table 中以供进一步处理。
PROCEDURE upload
IS
lv_post_dt DATE;
TYPE dataTblType IS TABLE OF My_Transaction_Table%ROWTYPE;
lv_dataTbl dataTblType;
CURSOR externalCur IS
SELECT lv_post_dt col1,
col2 --ORA-00904 invalid identifier is encountered here
FROM EXTERNAL_TABLE;
BEGIN
lv_post_dt := SYSTIMESTAMP;
OPEN externalCur;
LOOP
FETCH externalCur BULK COLLECT
INTO lv_dataTbl LIMIT 25000;
EXIT WHEN lv_dataTbl.COUNT = 0;
FOR i IN 1 .. lv_dataTbl.COUNT LOOP
--Insert recordsinto My_Transaction_Table
END LOOP;
CLOSE externalCur;
END upload;
下面我也试过了
CURSOR externalCur IS
SELECT lv_post_dt col1,
ext.col2 --ORA-00904 invalid identifier is encountered here
FROM EXTERNAL_TABLE ext;
CURSOR externalCur IS
SELECT lv_post_dt col1,
EXTERNAL_TABLE.col2 --ORA-00904 invalid identifier is encountered here
FROM EXTERNAL_TABLE;
即使 col2
属于 EXTERNAL_TABLE
,为什么我会收到无效标识符错误以及如何解决这个问题?
当我写 lv_post_dt col1
那么为什么它有效?
那是因为 不幸的是 双引号。你为什么使用它们?他们带来的只是问题。
这就是你所做的(忽略这不是外部的事实 table):
SQL> CREATE TABLE EXTERNAL_TABLE
2 ( "col1" DATE
3 , "col2" DATE
4 );
Table created.
你能select一切吗?当然:
SQL> select * from external_table;
no rows selected
你能select只col2
吗?并不真地;这是你的 ORA-00904: invalid identifier
:
SQL> select col2 from external_table;
select col2 from external_table
*
ERROR at line 1:
ORA-00904: "COL2": invalid identifier
为什么会这样?因为 双引号 。一旦你使用它们并在命名对象时混合(或小写)字母大小写,你必须每次都使用双引号并匹配字母大小写:
SQL> select "col2" from external_table;
no rows selected
SQL>
你应该怎么办?在我看来,删除 table 并重新创建它,但这次省略所有地方的双引号。