PL/SQL宏,就像在C编程中一样

SMK*_*MKS 5 oracle macros plsql

所以我一直在研究关于宏的C编程并使用它们,但在我的工作中我经常使用PL/SQL而且我想知道是否有某种方法可以在PL/SQL中执行相同类型的操作.现在我让它调用一个具有3个不同值的函数,然后返回一个值,但函数非常简单,我想我可以从原始存储过程内部完成.在C中,宏是一行(或多行)代码,它们在编译时完全被调用替换,但它比反复调用函数更有效.

C的例子:

#define query(fieldValue, Attribute, Table) (select fieldValue from Table where record = Attribute)
Run Code Online (Sandbox Code Playgroud)

当在代码体中调用时,查询(值,值,值)将完全被select语句替换.

只是一个粗略的例子,它可能出现在C中,因为我真的不确定它在PL/SQL中的表现.

这在SQL中可行吗?它必须是2-3行代码,就是这样.

非常感谢,SMKS

小智 1

根据 OldProgrammer 的评论,我认为您需要一个使用动态 SQL 从非常相似的 SQL 语句返回单个值的函数。

下面是如何实现这一点的示例:

declare 

  function get_field_val(
      p_field          varchar2,
      p_table          varchar2,
      p_where_clause   varchar2
  )   return varchar2 is
      v_query     clob;
      v_result    varchar2(4000);
  begin

      v_query := 'select to_char(' || p_field ||')' ||
                 'from ' || p_table || ' ' || p_where_clause;                 

      execute immediate v_query into v_result;

      return v_result;

  end;

begin

  dbms_output.put_line(
      get_field_val(
          p_field        => 'COLUMN_NAME',
          p_table        => 'ALL_TAB_COLUMNS',
          p_where_clause => 'where owner = ''SYS'' and table_name = ''ACCESS$''
              and column_id = 1'));

  dbms_output.put_line(
      get_field_val(
          p_field        => 'max(table_name)',
          p_table        => 'all_tables',
          p_where_clause => 'where owner = ''SYS'''));

end;
Run Code Online (Sandbox Code Playgroud)

对此有几点需要注意:

  1. 该函数只能返回单个 varchar 值。如果您想要不同类型或值数组,则需要使用内置或用户定义的 plsql 集合来解决此问题。
  2. 将此类函数公开可能是一个坏主意,因为这意味着任何人都可以使用与包定义者相同的权限运行任何查询(除非您使用 AUTHID CURRENT_USER 创建它)