简体   繁体   中英

ORA-00917: missing comma when I use EXECUTE IMMEDIATE

In the below when I run this script I getORA-00917: missing comma error.

Could you help me to resolve this issue .

DECLARE
  dblink     VARCHAR2(20);
  l_sql_stmt VARCHAR2 (1000);
TYPE array_t
IS
  varray(3) OF VARCHAR2(20);
  ARRAY array_t := array_t('AML','CAM' ,'CIN') ;
BEGIN
  FOR i IN 1..ARRAY.count
  LOOP
    dblink := ARRAY(i) ;
    l_sql_stmt := 'insert into Database_size (DBNAME,date1,Dbsize)values('
    ||dblink
    ||','
    || SYSDATE
    || ',(    
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 v$controlfile@'
    || dblink
    ||') d )';
    EXECUTE IMMEDIATE l_sql_stmt;
  END LOOP ;
END ;/

When I delete "EXECUTE IMMEDIATE l_sql_stmt" the script works fine

You're missing a '@' and a ')', try with:

l_sql_stmt := 'insert into Database_size (DBNAME,date1,Dbsize)values(' ||DBlink ||',' || sysdate|| ',( 
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 v$controlfile @' 
|| DBlink 
||') d )'; 

Anyway, I would suggest to break l_sql_stmt into smaller statements, as the composed INSERT is quite complex.

The resulting edits will produce three INSERTS like the following:

   INSERT INTO DATABASE_SIZE (DBNAME, DATE1, DBSIZE)
     VALUES (CAM, 22 - GEN - 15,
                         (SELECT ( (SELECT SUM (BYTES) / 1024 / 1024 / 1024 AS DATA_SIZE FROM DBA_DATA_FILES @CAM) 
                                + (SELECT NVL (SUM ( BYTES),  0) / 1024 / 1024 / 1024  TEMP_SIZE FROM DBA_TEMP_FILES @CAM) 
                                + (SELECT SUM (BYTES) / 1024 / 1024 / 1024 REDO_SIZE FROM SYS.V_$LOG @CAM)
                                + (SELECT SUM (BLOCK_SIZE * FILE_SIZE_BLKS) / 1024 / 1024 / 1024  CONTROLFILE_SIZE FROM V$CONTROLFILE@CAM))
                                    AS DBSIZE
                            FROM DUAL
                            )
                )

If correct, the edits to l_sql_stmt should be correct as well

replace your procedure with this one, let me know if it works:


DECLARE 
DBlink varchar2(20); 
l_sql_stmt VARCHAR2 (1000); 
type array_t is varray(3) of varchar2(20); 
array array_t := array_t('AML','CAM' ,'CIN') ; 
BEGIN 
FOR i in 1..array.count 
LOOP 
DBlink := array(i) ; 
l_sql_stmt := 'insert into Database_size (DBNAME,date1,Dbsize)values(' ||DBlink ||',' || sysdate|| ',( 
SELECT '
||'(SELECT SUM (bytes) / 1024 / 1024/1024 data_size FROM dba_data_files @'||DBlink||' ),' 
|| '(SELECT NVL (SUM (bytes), 0) / 1024 / 1024/1024 temp_size FROM dba_temp_files @'||DBlink||' ),' 
||'(SELECT SUM (bytes) / 1024 / 1024/1024 redo_size FROM sys.v_$log @'||DBlink||'),' 
||'(SELECT SUM (BLOCK_SIZE * FILE_SIZE_BLKS) / 1024 / 1024/1024 controlfile_size FROM v$controlfile @'||DBlink||') AS DBsize FROM DUAL))'  ; 
EXECUTE IMMEDIATE l_sql_stmt; 
END LOOP ; 
END ; 
/ 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM