DBA管理匿名块,错误为PLS-00103,ORA-06550

时间:2015-01-20 14:04:06

标签: sql database plsql oracle11g plsqldeveloper

我该怎么做才能运行这个脚本?

DECLARE
  l_sql_stmt varchar2(1000);
  DBlink varchar2(20);
   type array_t is varray(3) of varchar2(20);
   array array_t := array_t('A,'C','Ci') ;
BEGIN
 FOR i in 1..array.count 
   LOOP
      DBlink := array(i) 


     l_sql_stmt := 'SELECT (a.data_size + b.temp_size + c.redo_size + d.controlfile_size) as DBsize FROM (SELECT SUM (bytes) / 1024 / 1024/1024 data_size FROM dba_data_files'||DBlink||') a,(SELECT NVL (SUM (bytes), 0) / 1024 / 1024/1024 temp_size FROM dba_temp_files'||DBlink||') b,(SELECT SUM (bytes) / 1024 / 1024/1024 redo_size FROM sys.v_log'||DBlink||') c,(SELECT SUM (BLOCK_SIZE * FILE_SIZE_BLKS) / 1024 / 1024/1024 controlfile_size FROM vcontrolfile'||DBlink||') d )) ;' 
         EXECUTE IMMEDIATE l_sql_stmt
       END LOOP ;
    END;

第10行的错误: ORA-06550:第10行,第3栏: PLS-00103:在期待其中一个时遇到符号“L_SQL_STMT” 以下

1 个答案:

答案 0 :(得分:1)

以下是语法问题列表:

  1. 您的array_t转让声明在A。

    之后省略了一个结束引用

    array array_t := array_t('A','C','Ci');

  2. DBlink赋值语句需要分号:

    DBlink := array(i);

  3. 使用l_sql_stmt的作业声明,您的数据库链接需要' @'符号。另外,你的分号不应该是带引号的字符串。

  4. 别名c和d所代表的对象在我的数据库中不存在,因此我将其从测试查询中删除。

  5. 我假设您想要输出,因此我调用了dbms_output

  6. 测试脚本(删除了我没有的数据库链接):

        SYS@tst> DECLARE
      2    l_sql_stmt    VARCHAR2(1000);
      3    dblink        VARCHAR2(20);
      4    l_size        NUMBER;
      5  TYPE array_t IS VARRAY(3) OF VARCHAR2(20);
      6  ARRAY array_t := array_t('A','C','Ci');
      7  BEGIN
      8    FOR i IN 1..ARRAY.count
      9    loop
     10      dblink     := ARRAY(i);
     11      l_sql_stmt :='SELECT (a.data_size + b.temp_size) as DBsize FROM (SELECT SUM (bytes)/1024/1024/1024 data_size FROM dba_data_files) a,(SELECT NVL (SUM (bytes), 0)/1024/1024/1024 temp_size FROM dba_temp_files) b';
     12      EXECUTE IMMEDIATE l_sql_stmt INTO l_size;
     13      dbms_output.put_line('database size: '|| to_char(l_size));
     14    END loop;
     15  END;
     16  /
    database size: 1013.204803466796875
    database size: 1013.204803466796875
    database size: 1013.204803466796875
    
    PL/SQL procedure successfully completed.
    

    以下是更正后的匿名区块:

        DECLARE
      l_sql_stmt    VARCHAR2(1000);
      dblink        VARCHAR2(20);
      l_size        NUMBER;
    TYPE array_t IS VARRAY(3) OF VARCHAR2(20);
    ARRAY array_t := array_t('A','C','Ci');
    BEGIN
      FOR i IN 1..ARRAY.count
      loop
        dblink     := ARRAY(i);
        l_sql_stmt :='SELECT (a.data_size + b.temp_size + c.redo_size + d.controlfile_size) as DBsize FROM (SELECT SUM (bytes) / 1024 / 1024/1024 data_size FROM dba_data_files@'||dblink||') a,(SELECT NVL (SUM (bytes), 0) / 1024 / 1024/1024 temp_size FROM dba_temp_files@'||dblink||') b,(SELECT SUM (bytes) / 1024 / 1024/1024 redo_size FROM sys.v_log@'||dblink||') c,(SELECT SUM (BLOCK_SIZE * FILE_SIZE_BLKS) / 1024 / 1024/1024 controlfile_size FROM vcontrolfile@'||dblink||') d ))';
        EXECUTE IMMEDIATE l_sql_stmt into l_size;
        dbms_output.put_line('database '|| dblink || ' size: '|| to_char(l_size));
      END loop;
    END;