我正在遍歷表名字串陣列并將它們傳遞給以下函式:
FUNCTION table_empty(table_name VARCHAR2)
RETURN BOOLEAN
AS
row_count NUMBER := 0;
empty_sql VARCHAR2(255);
BEGIN
empty_sql := 'SELECT COUNT(1) FROM :tab_name';
EXECUTE IMMEDIATE empty_sql INTO row_count USING table_name;
DBMS_OUTPUT.PUT_LINE('Row Count: ' || table_name);
RETURN row_count > 0;
END table_empty;
但是,我收到此錯誤
意外錯誤:ORA-00903:表名無效
有沒有人知道是什么原因造成的?
uj5u.com熱心網友回復:
系結變數用于變數,而不是識別符號。決議動態陳述句時需要知道表名(和其他識別符號);然后在執行時應用變數值。在決議陳述句時,表名按字面解釋為:tab_name,這是一個無效名稱。
您需要連接名稱:
empty_sql := 'SELECT COUNT(1) FROM ' || table_name;
EXECUTE IMMEDIATE empty_sql INTO row_count;
不過,您可能想先驗證表名。
uj5u.com熱心網友回復:
這是使用SQL 宏的首選解決方案(避免將 table_name 連接為字串)(需要 Oracle 19.6 或更高版本)
在 SQL 宏中,您可以安全地將表名作為引數傳遞。
定義(表)SQL 宏
create or replace function my_count (t DBMS_TF.Table_t)
return varchar2 SQL_MACRO
is
begin
return q'[
select count(*) cnt from t]';
end;
/
表的用法 TAB
select cnt from my_count(tab);
SQL 宏的更多資訊和示例可以在這里和那里找到。
uj5u.com熱心網友回復:
你可以做這樣的事情,它會減輕包裝器在表中傳遞的需要。您可以添加一個 where 子句進行過濾。
如果您有包含大量行的表,這需要一些時間來完成
declare
tab_count number(3);
sql_stmt varchar2(100);
BEGIN
FOR cur_Rec IN (Select TABLE_NAME from user_tables) LOOP
sql_stmt := 'SELECT count(*) FROM '|| cur_Rec.TABLE_NAME;
EXECUTE IMMEDIATE sql_stmt INTO tab_count ;
DBMS_OUTPUT.PUT_LINE (cur_Rec.TABLE_NAME || ' ' || tab_count);
END LOOP;
END;
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/314308.html
