Oracle ORA-00904动态SQL块中的标识符错误无效

Oracle ORA-00904动态SQL块中的标识符错误无效,oracle,plsql,Oracle,Plsql,我正在运行下面的程序,一旦执行,就会报告一个错误,告诉我EST_ONE_ROW_MB是无效标识符 有人建议我可能需要让动态SQL部分作为独立查询运行,作为初始故障排除练习,但我在如何在此处编写子查询以生成所需的输出并消除错误方面有点困惑 create or replace procedure JUST_ME is --variables l_dblink varchar2(100) := 'DB1'; file_handle UTL_FILE.file_type; v_ts_name var

我正在运行下面的程序,一旦执行,就会报告一个错误,告诉我EST_ONE_ROW_MB是无效标识符

有人建议我可能需要让动态SQL部分作为独立查询运行,作为初始故障排除练习,但我在如何在此处编写子查询以生成所需的输出并消除错误方面有点困惑

create or replace procedure JUST_ME is

--variables

l_dblink varchar2(100) := 'DB1';
file_handle UTL_FILE.file_type;
v_ts_name varchar2(30);
v_link_name varchar2(10);
v_csv_name varchar2(100);
EST_ONE_ROW_MB varchar2(100) ;
TOTAL_ROW_COUNT NUMBER;
SPACE_REQUIRED NUMBER;
TOT_OBJECT_SIZE_MB NUMBER;
v_Mv_name varchar2(100);
v_sql1 varchar2(1500);
cur SYS_REFCURSOR;
owner varchar2(100);
table_name varchar2(100);
driver_table varchar2(100);
mandatory_join varchar2(100);
C_TOTAL_ROW_COUNT varchar2(100);
v_total_driver_only varchar2(100);
--

begin


SELECT tablename into v_csv_name
FROM BOB01.BOB_new_table_tracker
WHERE
CREATED_AT = (select MAX(CREATED_AT) from BOB01.BOB_new_table_tracker);

SELECT mv_name into v_Mv_name
FROM BOB01.BOB_new_table_tracker_mv
WHERE
CREATED_AT = (select MAX(CREATED_AT) from BOB01.BOB_new_table_tracker_mv);

select link_name into v_link_name from link_and_mail where mdate = (select max(mdate) from link_and_mail);
select distinct targetschema into v_ts_name from BOB01.MV_BOB_TABLE;

v_sql1 := 'SELECT /*+ monitor parallel (4)*/ a.owner,
                        a.table_name,
                        b.driver_table,
                        b.mandatory_join,
                        sum(c.sum_bytes) TOT_OBJECT_SIZE_MB,
                        (TOT_OBJECT_SIZE_MB) / (:C_TOTAL_ROW_COUNT) AS "EST_ONE_ROW_MB",
                        (EST_ONE_ROW_MB) * (:TOTAL_ROW_COUNT) AS "SPACE_REQUIRED"
                 FROM dba_tables@DB1 a, '|| v_Mv_name ||' b, MV_PRD_SEG_DATA c
                 WHERE a.table_name IN ( SELECT table_name
                                       FROM MV_BOB_TABLE
                                       WHERE driver_table IS NOT NULL
                                             AND   additional_joins IS NULL
                                     )
                 AND   a.owner IN ( SELECT DISTINCT productionschema FROM MV_BOB_TABLE c  )
                 and a.table_name = b.table_name
                 and a.table_name = c.segment_name
                 group by a.owner,a.table_name,b.driver_table,b.mandatory_join
               ORDER BY table_name';

file_handle := utl_file.fopen('ESTIMATES_CSV', v_csv_name||'_EST_PROC.csv', 'w', 32767);

--
UTL_FILE.PUT_LINE(file_handle, ' ');
UTL_FILE.PUT_LINE(file_handle, 'The below report shows total row counts in PROD');
UTL_FILE.PUT_LINE(file_handle, ' for unjoined tables in the BOB document:');
UTL_FILE.PUT_LINE(file_handle, ' ');
utl_file.put_line(file_handle, 'OWNER,TABLE_NAME,MANDATORY_JOIN,TOT_OBJECT_SIZE_MB,EST_ONE_ROW_MB,TOTAL_ROW_COUNT,SPACE_REQUIRED');
--main loop
open cur for v_sql1 using TOTAL_ROW_COUNT,C_TOTAL_ROW_COUNT;
   loop
      fetch cur into OWNER,TABLE_NAME,MANDATORY_JOIN,TOT_OBJECT_SIZE_MB,EST_ONE_ROW_MB,TOTAL_ROW_COUNT,SPACE_REQUIRED;--,EST_ONE_ROW_MB;
      exit when cur%NOTFOUND;
      execute immediate' select /*+parallel (4)*/ count(*) from '||owner||'.'||table_name || '@' || l_dblink into TOTAL_ROW_COUNT;

execute immediate' select /*+monitor parallel (10)*/ count(*) from ' ||owner||'.'||table_name || '@' || l_dblink||' b '||','||
driver_table || '@' || l_dblink||' a ' ||' where ' ||mandatory_join into TOTAL_ROW_COUNT;

execute immediate' select /*+monitor parallel (10)*/ count(*) from ' ||owner||'.'||table_name || '@' || l_dblink into C_TOTAL_ROW_COUNT;

utl_file.put_line(file_handle,
                      OWNER || ',' ||
                      TABLE_NAME || ',' ||
                      TOT_OBJECT_SIZE_MB || ',' ||
                      TOTAL_ROW_COUNT || ',' ||
                      C_TOTAL_ROW_COUNT || ',' || 
                      round(TOT_OBJECT_SIZE_MB / C_TOTAL_ROW_COUNT,7)|| ',' ||
                      round(round(TOT_OBJECT_SIZE_MB / C_TOTAL_ROW_COUNT,7) * round(TOTAL_ROW_COUNT,0),0)
                      );


v_total_driver_only := v_total_driver_only + round(TOT_OBJECT_SIZE_MB / C_TOTAL_ROW_COUNT,7) * round(TOTAL_ROW_COUNT,0);

end loop;

UTL_FILE.PUT_LINE(file_handle, ' ');
utl_file.put_line(file_handle,
                     'Total Estimated Space Required '|| round(v_total_driver_only,0) ||' MB'
                     );

utl_file.fclose(file_handle);

end JUST_ME;

以这种方式使用
EST_ONE_ROW_MB
是不可能的,因为它没有定义为列。 将其替换为
(TOT\u OBJECT\u SIZE\u MB)/(:C\u TOTAL\u ROW\u COUNT)

如果您有一个内联视图,就可以这样做。e、 g

select EST_ONE_ROW_MB  * (:TOTAL_ROW_COUNT) AS "SPACE_REQUIRED"
from(
  select (TOT_OBJECT_SIZE_MB) / (:C_TOTAL_ROW_COUNT) AS "EST_ONE_ROW_MB"
   from ....
)       

以这种方式使用
EST_ONE_ROW_MB
是不可能的,因为它没有定义为列。 将其替换为
(TOT\u OBJECT\u SIZE\u MB)/(:C\u TOTAL\u ROW\u COUNT)

如果您有一个内联视图,就可以这样做。e、 g

select EST_ONE_ROW_MB  * (:TOTAL_ROW_COUNT) AS "SPACE_REQUIRED"
from(
  select (TOT_OBJECT_SIZE_MB) / (:C_TOTAL_ROW_COUNT) AS "EST_ONE_ROW_MB"
   from ....
)       

那么,我是否需要更改别名在SQL中的显示顺序?与其自上而下地将EST_ONE_ROW_MB排在第一位,相反,它需要以另一种方式出现?这不是别名在选择列表中出现的顺序,只是不能在同一查询级别中使用它们(order by子句除外)。还要注意,
TOT\u OBJECT\u SIZE\u MB
是在同一级别声明的,因此您也不能使用它,并且必须用
sum(c.sum\u bytes)
替换这些引用。我发现
TOT\u OBJECT\u SIZE\u MB
也会有同样的问题。问题不在于顺序。您应该直接使用计算值,而不是列的别名(示例1)。或者,您可以在内联视图中选择所需的值,并将其用于select(示例2)中的计算值。那么,我是否需要更改别名在SQL中的显示顺序?与其自上而下地将EST_ONE_ROW_MB排在第一位,相反,它需要以另一种方式出现?这不是别名在选择列表中出现的顺序,只是不能在同一查询级别中使用它们(order by子句除外)。还要注意,
TOT\u OBJECT\u SIZE\u MB
是在同一级别声明的,因此您也不能使用它,并且必须用
sum(c.sum\u bytes)
替换这些引用。我发现
TOT\u OBJECT\u SIZE\u MB
也会有同样的问题。问题不在于顺序。您应该直接使用计算值,而不是列的别名(示例1)。或者,您可以在内联视图中选择所需的值,并将其用于select中的计算值(示例2)。