大家好,我是Oracle新手。请问一下在Oracle中怎么判断一个表是否存在 然后进行查询
SQL中是这样的
if exists(select name from sysobjects where name='tableName' and type='u')
select top 1 Content from tableName
请问Oracle中应该怎么实现
SQL中是这样的
if exists(select name from sysobjects where name='tableName' and type='u')
select top 1 Content from tableName
请问Oracle中应该怎么实现
i_l_count pls_integer;
begin
select count(*)
into i_l_count
from user_tables t
where t.TABLE_NAME = 'TABLE_NAME';
if i_l_count > 0 then
-- 要执行的语句
end if;
end;
DECLARE
tCount number(10);
BEGIN
SELECT COUNT(1) INTO tCount FROM user_tables WHERE table_name='prnbsn_user';
IF tCount>0 THEN
select * from user_tables;
END if;
END;
必须把要执行的sql放在字符串里,用·EXECUTE IMMEDIATE 语句执行。
declare --声明一个临时变量(用于存放,是否存在该表的标识符,0表示不存在,1表示存在)
num number;
flag varchar(2);
begin
select count(1) into num from user_tables where TABLE_NAME='STUDY_D'; --特别注释:此处查询条件的表名,必须大写
if num>0 then
dbms_output.put_line('该表已存在,正在进行查询操作');
EXECUTE IMMEDIATE 'SELECT * FROM DUAL';
END IF;
dbms_output.put_line('该表不存在');
end;
实测数据:CREATE TABLE T147
(
ID NUMBER(4),
MyDesc VARCHAR2(20)
);
INSERT INTO T147 VALUES(1, 'A');
INSERT INTO T147 VALUES(2, 'B');
INSERT INTO T147 VALUES(3, 'C');
定义的存储过程:CREATE OR REPLACE PROCEDURE ProcSelectByTableName(pTableName VARCHAR2)
IS
vFlag NUMBER(1); -- 标志表是否存在
vSQL VARCHAR2(2000); -- 整个查询语句
vCur INTEGER := DBMS_SQL.open_cursor;
vColCnt NUMBER(2) := 0;
vDescTable DBMS_SQL.desc_tab;
vColValue VARCHAR2(2000); --保存一列的值,用于所有列
vLoop NUMBER(2) := 0; --循环变量
vRecord LONG; --保存一条记录
vStatus INTEGER; --动态SQL执行状态
BEGIN
SELECT COUNT(1) INTO vFlag FROM user_tables WHERE table_name = upper(pTableName);
IF vFlag = 1 THEN -- 表存在
vSQL := 'SELECT * FROM ' || pTableName || ' WHERE rownum <= 1';
DBMS_SQL.PARSE(vCur, vSQL, DBMS_SQL.native);
-- 获得输出结果中各列的值和列数
DBMS_SQL.describe_columns(vCur, vColCnt, vDescTable);
-- 对于每一列需要定义它,并告诉数据库我们需要获取哪些数据,这里是获取所有数据
FOR i IN 1..vColCnt LOOP
DBMS_SQL.define_column(vCur, i, vColValue, 2000);
END LOOP;
-- 执行查询
vStatus := DBMS_SQL.execute(vCur);
-- 获取所有行
WHILE (DBMS_SQL.fetch_rows(vCur) > 0) LOOP
vLoop := vLoop + 1;
vRecord := vLoop;
FOR j IN 1..vColCnt LOOP
DBMS_SQL.column_value(vCur, j, vColValue);
vRecord := vRecord || ', ' || vColValue;
END LOOP;
DBMS_OUTPUT.PUT_LINE(vRecord);
END LOOP;
END IF;
EXCEPTION
WHEN OTHERS THEN
DBMS_SQL.close_cursor(vCur);
RAISE;
END ProcSelectByTableName;
测试结果: