我现在用的是DBLINK远程连的数据库。
在开发程序时用PL/SQL写个ETL过程,在判断远程数据表是否存在的地方停住了。
我现在知道在ALL_TABLES中可以看到本地的表名。但在远程我写了一个游标
CURSOR CUR_TEST IS
SELECT TABLE_NAME 
FROM ALL_TABLES@DDDDDD 是我的一个参数。这样就报错!请高手指教!学习中

解决方案 »

  1.   

    select 1 from TABLE_NAME ;看其结果就可以了
      

  2.   

    远程写了个游标啥意思啊?
    在远程数据库里面就不需要@啦。
    检查下dblink的那个用户有没有权限select all_tables。
      

  3.   


    是这样的。我本机是准备通过DBLINK对数据表数据进行全量的抽取,我在删除之前要判断远程的表是否能访问到,要不删除去会出现问题,但在判断表存在时两个参数1表名、2DBLINK名
    CURSOR CUR_TEST IS 
    SELECT TABLE_NAME 
    FROM ALL_TABLES@DBLINK名
    where table_name=表名
    这样会报错。在DBLINK名处报缺少表达式错。
      

  4.   

    我试验了一下,没出现你说的错误,估计不是DBLInk的问题[TEST@ora10gr1#2009-12-11/08:24:25] SQL>l
      1  declare
      2  cursor cur is
      3  select table_name from all_tables@dblink_test01;
      4  begin
      5  for rec in cur loop
      6  dbms_output.put_line(rec.table_name);
      7  end loop;
      8* end;
    [TEST@ora10gr1#2009-12-11/08:25:13] SQL>/
    DUAL
    SYSTEM_PRIVILEGE_MAP
    TABLE_PRIVILEGE_MAP
    STMT_AUDIT_OPTION_MAP
    AUDIT_ACTIONS
    SCHEDULER$_JOB_STEP_STATE
    AW$EXPRESS
    AW$AWMD
    AW$AWCREATE
    AW$AWXML
    OLAPI_HISTORY
    OLAPI_SESSION_HISTORY
    OLAPI_IFACE_OBJECT_HISTORY
    OLAPI_IFACE_OP_HISTORY
    OLAPI_MEMORY_OP_HISTORY
    OLAPI_MEMORY_HEAP_HISTORY
    OLAP_OLEDB_KEYWORDS
    OLAP_OLEDB_MDPROPVALS
    OLAP_OLEDB_MDPROPS
    OLAP_OLEDB_FUNCTIONS_PVT
    DEF$_TEMP$LOB
    HELP
    MVIEW$_ADV_INDEX
    MVIEW$_ADV_PARTITION
    DM$RESULT_PROPERTY
    DM$PMML_DTD
    DM$APPLY_CONTENT_ITEM
    DM$APPLY_CONTENT_SETTING
    DM$APPLY_CONTENT_SETTING_ARRAY
    DM$ATTRIBUTE
    DM$ATTRIBUTE_PROPERTY
    DM$CATEGORY
    DM$CATEGORY_EX
    DM$CATEGORY_SET
    DM$CATEGORY_MATRIX_ENTRY
    DM$PRIOR_PROBABILITY_ENTRY
    DM$LIFT_RESULT_ENTRY
    DM$MODEL_PROPERTY
    DM$MODEL_PROPERTY_ARRAY
    DM$SETTING
    DM$SETTING_ARRAY
    DM$SETTINGS_MAP
    WM$WORKSPACES_TABLE
    WM$VERSION_TABLE
    WM$NEXTVER_TABLE
    WM$VERSION_HIERARCHY_TABLE
    CS_SRS
    OGIS_SPATIAL_REFERENCE_SYSTEMS
    SDO_DIST_UNITS
    SDO_AREA_UNITS
    USER_CS_SRS
    USER_TRANSFORM_MAP
    SDO_ANGLE_UNITS
    SDO_ELLIPSOIDS
    SDO_PROJECTIONS
    SDO_DATUMS
    SDO_GEOR_XMLSCHEMA_TABLE
    SDO_CMT_CBK_FN_TABLE
    DR$OBJECT_ATTRIBUTE
    DR$POLICY_TAB
    DR$NUMBER_SEQUENCE
    WK$SUBSCRIBER_LIST
    WK$SYS_CONFIG
    WK$CRAWLER_CONFIG_DEFAULT
    WK$DEFAULT_DATA_SOURCE_TYPE
    WK$DEFAULT_DATA_SOURCE_PARAM
    WK$MIMETYPES
    WK$CHARSET
    WK$LANG
    WK$DOC_LANG
    WK$ACL_SNAPSHOT
    T1
    T2
    CWM2$_AW_NEXT_TEMP_CUST_MEAS
    CWM2$_AW_TEMP_CUST_MEAS_MAP
    CWM2$_TEMP_VALUES
    CWM2$AWDIMCREATEACCESS
    CWM2$AWCUBECREATEACCESS
    OLAP_SESSION_DIMS
    OLAP_SESSION_CUBES
    SDO_TXN_IDX_DELETES
    SDO_TXN_IDX_EXP_UPD_RGN
    SDO_GR_MOSAIC_0
    SDO_GR_MOSAIC_1
    SDO_GR_MOSAIC_2
    SDO_GR_MOSAIC_3
    SDO_TOPO_TRANSACT_DATA
    SDO_TOPO_RELATION_DATA
    SDO_TOPO_DATA$
    SDO_TXN_IDX_INSERTS
    SDO_CMT_CBK_DML_TABLE
    OL$
    OL$HINTS
    OL$NODES
    MVIEW$_ADV_OWB
    PSTUBTBL
    ODCI_SECOBJ$
    ODCI_WARNINGS$
    KU$NOEXP_TAB
    PLAN_TABLE$
    OLAPTABLEVELS
    OLAPTABLEVELTUPLESPL/SQL procedure successfully completed.[TEST@ora10gr1#2009-12-11/08:25:16] SQL>
    应该是你where条件的问题,如果你的【表名】是作为参数传入的,就要使用带参数的游标了,由于你的具体情况不详,只能言尽于此了。
      

  5.   

    这样的话,你可以用动态游标来做。
    比如 
    create or replace function aaaaa (
        p_db_link  in  varchar2
    ) return sys_refcursor
    as
        x_sql varchar2(200);
        o_cur  sys_refcursor;
    begin
        x_sql :='select table_name from all_tables@'||p_db_link;
        open o_cur for x_sql;
        return o_cur;
    end aaaaa;
    /