【问题标题】:DBA administration anonymous block with the errors PLS-00103 , ORA-06550带有错误 PLS-00103 和 ORA-06550 的 DBA 管理匿名块
【发布时间】:2015-03-18 19:06:17
【问题描述】:

我要如何运行这个脚本?

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” 关注

【问题讨论】:

  • 我建议把它交给堆栈交换的Database Administrator 部分,我想你在那里获得帮助会更好。

标签: sql database plsql oracle11g plsqldeveloper


【解决方案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

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

    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;

【讨论】:

  • 第 1 行出现错误:ORA-00933:SQL 命令未正确结束 ORA-06512:第 12 行
  • @ALwaleedALdajani 在我的测试脚本中,我使用了into l_size 作为EXECUTE IMMEDIATE 语句的一部分,但我在更正的匿名块中没有这个。接下来,我用微不足道的l_sql_stmt 运行了该块,并且您引用的错误不会发生。在此之前,我能够复制您的错误。
猜你喜欢
  • 1970-01-01
  • 2018-04-12
  • 1970-01-01
  • 1970-01-01
  • 2017-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多