环境是Oracle 9和10.我没有DBA级别的访问权限.
问题是在另一个模式中验证特定表中是否存在特定列.
有两种情况需要处理.
鉴于我的模式FRED和另一个模式BARNEY,我试过这样的事情
SELECT 1
FROM BARNEY.USER_TAB_COLS
WHERE TABLE_NAME = 'SOME_TABLE'
AND COLUMN_NAME = 'SOME_SPECIFIC_COLUMN'
Run Code Online (Sandbox Code Playgroud)
产生了[1] :(错误):ORA-00942:表或视图不存在
在这一段时间过后,我意识到USER_TAB_COLS,实际上不是一个表.这是一种观点.我一直在从表中选择,但不是从视图中选择.
我用db_link尝试了同样的事情,并惊讶地看到数据回来了.db_link中有一个嵌入式schema_name /密码,所以我觉得它有用,因为它有效地登录到另一个模式,这应该使视图可以访问.
谷歌搜索了我的眼球,并在Oracle医生的山上磨了我的眼球,我正在寻找有人指出我正确的方向,或者至少指出我错过了什么.
有哪些技术可用于从同一实例中的模式获取与用户表相关的元数据,以验证特定列是否存在?
提前致谢.
邪恶.
+1为好的答案.谢谢.
我创建了一个名为的表dual2.我在那里有一行,可以从中选择.尝试删除它时,会产生此错误:
第1行的错误:
ORA-00604:递归SQL级别1发生错误
ORA-00942:表或视图不存在
但是,表仍然存在!它从dba_tables和返回user_tables.
关于这里发生了什么的任何想法?
alt text http://img180.imageshack.us/img180/6012/28140463.png
这是我用plsql开发人员创建的表创建脚本:
-- Create table
create table
(
DUMMY VARCHAR2(1)
)
tablespace SYSTEM
pctfree 10
pctused 40
initrans 1
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
);
Run Code Online (Sandbox Code Playgroud)
PS:p.cambell感谢您的编辑!抱歉我的英语不好:)
最初我试图创建一个异常来捕获一个不存在的表 (-00942)。根据 Alex 和 Raj 的反馈,我修改了代码以使用 EXECUTE IMMEDIATE。这有助于识别表,但是当我将表从“员工”更正为“员工”时,这是我数据库中存在的表,我本来希望代码运行时不会出错,就像我没有使用 EXECUTE IMMEDIATE 一样.
使用 EXECUTE IMMEDIATE 时,代码是否可以无异常地运行,而不是生成 catch all 异常?
EXECUTE IMMEDIATE 'SELECT last_name INTO v_name FROM Employees WHEREsalary = v_sal';
WHEN OTHERS THEN :g_message := '发生了其他一些错误。';
我希望代码能够无一例外地运行。
VARIABLE g_message VARCHAR2(250)
DEFINE p_sal = 12000
DECLARE
v_name employees.last_name%TYPE;
v_sal employees.salary%TYPE := &p_sal;
table_does_not_exist exception;
PRAGMA EXCEPTION_INIT(table_does_not_exist, -942);
BEGIN
EXECUTE IMMEDIATE
'SELECT last_name INTO v_name FROM employees WHERE salary = v_sal';
DBMS_OUTPUT.put_line(v_name);
EXCEPTION
WHEN table_does_not_exist then
:g_message := 'table dose not exist';
WHEN …Run Code Online (Sandbox Code Playgroud) plsql exception-handling dynamic-sql ora-00942 oracle-sqldeveloper
我有以下SQL语法:
SELECT firmenstamm.firmen_id,
firmenstamm.firmenname_1,
kreditorenstamm.kreditorenname_1,
debitor.debitoren_id,
debitor.deb_id_vom_kreditor,
debitorenstamm.debitorenname_1,
zahlung.zahlung_nr,
zahlung.zahlung_betrag,
zahlung.zahlung_betrag_offen,
zahlung.zahlung_datum,
kreditorenstamm.kreditoren_id,
bankbewegung.name_ag,
bankbewegung.verwendungzweck
FROM debitor,
debitorenstamm,
firmenstamm,
kreditorenstamm,
zahlung
LEFT JOIN z_bankbewegung ON zahlung.zahlungs_id = z_bankbewegung.zahlungs_id,
LEFT JOIN bankbewegung ON z_bankbewegung.babe_id = bankbewegung.babe_id
WHERE ( firmenstamm.firmen_id = kreditorenstamm.firmen_id ) and
( kreditorenstamm.kreditoren_id = debitor.kreditoren_id ) and
( debitor.debitoren_id = debitorenstamm.debitoren_id ) and
( debitor.kreditoren_id = zahlung.kreditoren_id ) and
( debitor.deb_id_vom_kreditor = zahlung.deb_id_vom_kreditor ) and
( ( zahlung.zahlung_betrag_offen > 0 ) )
Run Code Online (Sandbox Code Playgroud)
我的问题现在如下:你可以看到我在同一个表上进行了多次左连接.我总是收到错误消息"表或视图不存在"(ORA-00942).
zahlung
LEFT JOIN z_bankbewegung ON zahlung.zahlungs_id …Run Code Online (Sandbox Code Playgroud) 我在Oracle视图上执行sql查询时遇到了一个奇怪的行为.该视图包含多个连接.当我键入常规sql时:
select * from vView - I receive the error that view is not found
select * from "vView" - The query is executed.
Run Code Online (Sandbox Code Playgroud)
我想知道为什么?
下面是我的sql:
CREATE OR REPLACE FORCE VIEW "TMSCODE"."vCountEventsData" ("EV_ID_NUMBER", "SI_ID", "EV_YEAR", "EV_INS_DATE", "EV_REM_DATE", "EV_AADT_TOT", "EV_AADT_DIR1", "EV_AADT_DIR2", "EV_REPORT", "DIRECTION", "CNAME", "STATION_DESC") AS
SELECT
"TMSCODE"."STC_EVENTS".EV_ID_NUMBER,
"TMSCODE"."STC_EVENTS".SI_ID,
"TMSCODE"."STC_EVENTS".EV_YEAR,
"TMSCODE"."STC_EVENTS".EV_INS_DATE,
"TMSCODE"."STC_EVENTS".EV_REM_DATE,
"TMSCODE"."STC_EVENTS".EV_AADT_TOT,
"TMSCODE"."STC_EVENTS".EV_AADT_DIR1,
"TMSCODE"."STC_EVENTS".EV_AADT_DIR2,
"TMSCODE"."STC_EVENTS".EV_REPORT,
"TMSCODE"."D_DIRECTION".DIRECTION,
"TMSCODE"."D_CONSULTANT".CNAME,
"TMSCODE"."D_STATION_TYPE".STATION_DESC
FROM
"TMSCODE"."STC_EVENTS"
INNER JOIN "TMSCODE"."D_DIRECTION" ON ("TMSCODE"."STC_EVENTS".EV_DIR = "TMSCODE"."D_DIRECTION".ID)
INNER JOIN "TMSCODE"."D_CONSULTANT" ON ("TMSCODE"."STC_EVENTS".EV_CONS = "TMSCODE"."D_CONSULTANT".ID)
INNER JOIN "TMSCODE"."D_STATION_TYPE" ON ("TMSCODE"."STC_EVENTS".EV_STATION_TYPE = …Run Code Online (Sandbox Code Playgroud) 我从java传递一个select查询,它适用于所有表,但其中一个表得到一个错误"ora-00942表或视图不存在".我检查了授权和所有,它对所有表都一样.但由于某种原因,它抱怨这个特定的表格.但是,如果我在sql中运行相同的查询,它完全正常.有人能告诉我背后的原因可能是什么.谢谢