加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

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

C的例子:

#define query(fieldValue,Attribute,Table) (select fieldValue from Table where record = Attribute)

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

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

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

非常感谢,
???SMKS

解决方法

从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;

关于这个的一些注意事项:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读