首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PL/SQL宏,类似于C编程

PL/SQL宏,类似于C编程
EN

Stack Overflow用户
提问于 2014-10-14 20:24:12
回答 2查看 5.6K关注 0票数 5

因此,我一直在学习关于宏的C编程,并使用它们,但是在我的工作中,我经常使用PL/SQL,我想知道在PL/SQL中是否有什么方法可以完成相同的事情。现在,我让它用3个不同的值调用一个函数,然后返回一个值,但是这个函数非常简单,我想我可以在原始存储过程内部完成它。在C中,宏是代码的一行(或多行),编译时被调用完全取代,但它比一次又一次调用函数更有效。

C中的示例:

代码语言:javascript
复制
#define query(fieldValue, Attribute, Table) (select fieldValue from Table where record = Attribute)

当在代码正文中调用时,查询( value、value、value)将被select语句完全替换。

只是一个简单的例子,说明它在C中的表现,因为我真的不确定它在PL/SQL中会是怎样的。

这在SQL中是可能的吗?它必须是2-3行代码,仅此而已。

非常感谢,SMKS

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-14 22:44:42

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

下面是如何实现这一目标的一个例子:

代码语言:javascript
复制
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;

关于这一点,有几点要注意:

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

Stack Overflow用户

发布于 2018-07-11 14:55:48

在大多数语言中都有一种使用宏的方法,但它确实需要额外的一步。m4宏处理器可以用作预处理器.

有相当多的资源可用于m4,只有m4宏处理器的谷歌。

下面是一个简单的PL/SQL示例

下面是宏文件。

m4_discard和m4_undiscard代码并不是绝对必要的,它可以减少输出中的空白。

'define( m4_discard ',define(m4_undiscard',‘dnl’(Divnum)转道(-1)dnl“m4_discard

代码语言:javascript
复制
define(`pl_sleep',`dbms_lock.sleep($1);')
define(`noop',`null;')
define(`useless_loop',
`for i in 1..$1
 loop
   $2($3)
end loop;')
m4_undiscard

下面是PL/SQL文件test.m4sql

代码语言:javascript
复制
include(./macros)

useless_loop(`10',`pl_sleep',`.1')

useless_loop(`10',`noop',`.1')

下面是一些PL/SQL预处理。

代码语言:javascript
复制
    >  m4 test.m4sql





   for i in 1..10
   loop
      dbms_lock.sleep(.1);
   end loop;


   for i in 1..10
   loop
      null;
   end loop;

还有比我想要的更多的空白,但是您可以看到如何使用m4。

您是否使用这个取决于您想要多大程度地使用宏。

正如其他答案所述,动态SQL可能是答案。

有时动态SQL可能运行良好,但对于某些用途,例如PL/SQL的动态块,它是一个编码噩梦。

我的目的是在当前的PL/SQL项目中使用m4,在这个项目中,每个过程的开始和结束都需要一些日志代码。在我看来,这种使用实际上并不适合动态SQL,而且m4只需要使用一次就可以根据需要使用调用来修改代码。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26369653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档