我该怎么做才能运行这个脚本?
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” 以下
答案 0 :(得分:1)
以下是语法问题列表:
您的array_t
转让声明在A。
array array_t := array_t('A','C','Ci');
DBlink
赋值语句需要分号:
DBlink := array(i);
使用l_sql_stmt
的作业声明,您的数据库链接需要' @'符号。另外,你的分号不应该是带引号的字符串。
别名c和d所代表的对象在我的数据库中不存在,因此我将其从测试查询中删除。
我假设您想要输出,因此我调用了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;