大家好,我是Oracle新手。请问一下在Oracle中怎么判断一个表是否存在 然后进行查询
SQL中是这样的
if exists(select name from sysobjects where name='tableName' and type='u') 
select top 1 Content from tableName
请问Oracle中应该怎么实现

解决方案 »

  1.   

    declare
        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;
      

  2.   

    if和end if之间加了 select 会出现错误
      

  3.   

    我贴下代码好了
    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;
      

  4.   

    PL/SQL程序块里不能放单独的sql查询语句,oracle里没有类似的sql查询语句,你只能先从数据字典查这个表是否存在,然后再查询这个表里的记录。
      

  5.   

    如果表不存在的话,编译都无法通过。
    必须把要执行的sql放在字符串里,用·EXECUTE IMMEDIATE 语句执行。
      

  6.   

    在出来之前可以先判断存不存,可以从tabs ,all_objects,user_tables 中都可以查到的,你自己看下吧,表不存在的话,过程编译通不过,这是后就要按照楼上二楼的说的做了
      

  7.   


    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; 
      

  8.   

    写一个存储过程吧。
    实测数据: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;
    测试结果:
      

  9.   

    遇到date等其他类型字段怎么处理?