如何确定通用 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 子句)?的主要内容,如果未能解决你的问题,请参考以下文章

尝试从过程中获取数据时:PL/SQL - 数字或值错误

Oracle PL/SQL:如何使用可变数组作为输出参数执行过程?

如何使用EXECUTE关键字执行带参数的PL / SQL存储过程[关闭]

PL/SQL:将词法参数传递给存储过程

PL/SQL 如何获取 SP 的 OUT 参数

如何使用参数从 Oracle PL/SQL 执行 Java jar 文件?