gpt4 book ai didi

oracle - PL/SQL 宏,就像 C 编程中的那样

转载 作者:行者123 更新时间:2023-12-02 07:03:31 25 4
gpt4 key购买 nike

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

来自 C 的示例:

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

当在代码主体中调用时,query(value, value, value) 将完全被 select 语句替换。

只是一个粗略的例子,说明它在 C 中如何出现,因为我真的不确定它在 PL/SQL 中会如何。

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

非常感谢, SMKS

最佳答案

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

有很多可用于 m4 的资源,只需 google 即可找到 m4 宏处理器。

这是一个简单的 PL/SQL 示例

以下是宏文件。

m4_discard 和 m4_undiscard 代码并不是严格必要的,它用于减少输出中的空白。

'define(m4_discard', define(m4_undiscard', `divert'(divnum))divert(-1)')dnl"m4_discard

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

include(./macros)

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

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

现在进行一些 PL/SQL 预处理

    >  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 的动态 block ,这是一场编码噩梦。

我的目的是在当前的 PL/SQL 项目中使用 m4,其中我需要在每个过程的开头和结尾处编写一些日志记录代码。在我看来,这种用法不太适合动态 SQL,m4 只需要使用一次即可根据需要使用调用来改进代码。

关于oracle - PL/SQL 宏,就像 C 编程中的那样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26369653/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com