如何确定通用 PL/SQL 过程的参数(执行 group by 子句)?
Posted
技术标签:
【中文标题】如何确定通用 PL/SQL 过程的参数(执行 group by 子句)?【英文标题】:How to determine parameters for the generic PL/SQL procedure (executes a group by clause)? 【发布时间】:2014-01-21 06:55:27 【问题描述】:我想创建一个通用的 Oracle PL/SQL 过程,它以表名和列名作为参数,然后通过 SQL 对表名创建组。然后我的程序的基本结构是这样的:
CREATE OR REPLACE PROCEDURE P_GROUPBY (
P_Table_Name IN ,
P_Column_Name IN ,
)
BEGIN
/**********************Check Parameters ************************/
IF (P_Table_Name IS NULL OR P_Column_Name IS NULL)
THEN
Raise_Application_Error (-20001, 'Parameter cannot be NULL');
END IF;
/**********************Select statment ************************/
SELECT P_Column_Name, COUNT(*) AS CNT
FROM P_Table_Name
GROUP BY P_Column_Name
ORDER BY P_Column_Name;
EXCEPTION
WHEN OTHERS
THEN
ROLLBACK;
DBMS_OUTPUT.Put_Line ('Cannot run the statement');
Raise_Application_Error (-20004,
'Could not run the procedure: ' || SQLERRM);
END P_GROUPBY;
如何确定参数的数据类型?如何做到这一点?
【问题讨论】:
【参考方案1】:你不能像这样发出 SQL 语句:
SELECT P_Column_Name, COUNT(*) AS CNT
FROM P_Table_Name
GROUP BY P_Column_Name
ORDER BY P_Column_Name;
解决办法是使用动态sql:
v_sql := 'SELECT ' || P_Column_Name || ', COUNT(*) AS CNT' ||
'FROM ' || P_Table_Name ||
'GROUP BY ' || P_Column_Name ||
'ORDER BY ' || P_Column_Name;
EXECUTE IMMEDIATE v_sql;
关于How to determine the data type for the parameters?
我不确定你的意思。您可能想确定表中特定列的类型?如果是,那么您可以查询USER_TAB_COLS
查看:
select data_type from user_tab_cols
where table_name = P_Table_Name
and column_name = P_Column_Name;
再补充一点:只要不修改过程中的任何数据,就不需要在异常处理部分使用ROLLBACK
。
【讨论】:
谢谢,我的意思是在程序中我有这些参数描述:P_Table_Name IN ,P_Column_Name IN 。 IN子句后面应该是什么数据类型? @jrara 通常varchar2
用于 PL/SQL 中的字符串值:P_Table_Name IN varchar2
。以上是关于如何确定通用 PL/SQL 过程的参数(执行 group by 子句)?的主要内容,如果未能解决你的问题,请参考以下文章
Oracle PL/SQL:如何使用可变数组作为输出参数执行过程?