編寫一個接受變量的存儲過程
2024-07-21 02:39:09
供稿:網友
問:我想要寫一個存儲過程,可以接受變量并使用它作為select語句中的表名。下面的代碼我無法編譯。
CREATE OR REPLACE PROCEDURE USP_STAT_FEATURE_COUNT (
P_TABLENAME IN VARCHAR2
,P_PPMS IN VARCHAR2
,P_FEATURE_COUNT OUT NUMBER
)
IS
/******************************************************************************
NAME: USP_STAT_FEATURE_COUNT
PURPOSE: Count of all drawings in the system ******************************************************************************/ TBL varchar2(50); BEGIN TBL := P_TABLENAME; SELECT COUNT(OBJECTID) INTO P_FEATURE_COUNT FROM P_TABLENAME WHERE PPMS = P_PPMS; COMMIT; END USP_STAT_FEATURE_COUNT;
/ 答:你不能這樣做!為什么,你一定會問。因為一方面你想要SQL語句成為基于表名和列值的動態的語句,另一方面你使用了STATIC SQL語句。還有,假如你想要做出任何的數據庫更改只需要COMMIT,假如你SELECT數據到PL/SQL 變量的話就不需要。
你需要使用本來的動態SQL(假如更復雜的話,就是DBMS_SQL)來獲得你的目的。 下面是可以編譯的版本。 CREATE OR REPLACE PROCEDURE USP_STAT_FEATURE_COUNT (
P_TABLENAME IN VARCHAR2
,P_PPMS IN VARCHAR2
,P_FEATURE_COUNT OUT NUMBER
)
IS /******************************************************************************
NAME: USP_STAT_FEATURE_COUNT
PURPOSE: Count of all drawings in the system ******************************************************************************/ --TBL varchar2(50); BEGIN -- TBL := P_TABLENAME; 這個語句不必要 -- 你的P_TABLE_NAME 應該與table和name之間的沒有下劃線的參數名相匹配 EXECUTE IMMEDIATE ' SELECT COUNT(OBJECTID) FROM ' P_TABLENAME ' WHERE PPMS = ' P_PPMS
INTO P_FEATURE_COUNT;
-- COMMIT 你不需要commit; END USP_STAT_FEATURE_COUNT;
/