因此,我一直在学习关于宏的C编程,并使用它们,但是在我的工作中,我经常使用PL/SQL,我想知道在PL/SQL中是否有什么方法可以完成相同的事情。现在,我让它用3个不同的值调用一个函数,然后返回一个值,但是这个函数非常简单,我想我可以在原始存储过程内部完成它。在C中,宏是代码的一行(或多行),编译时被调用完全取代,但它比一次又一次调用函数更有效。
C中的示例:
#define query(fieldValue, Attribute, Table) (select fieldValue from Table where record = Attribute)当在代码正文中调用时,查询( value、value、value)将被select语句完全替换。
只是一个简单的例子,说明它在C中的表现,因为我真的不确定它在PL/SQL中会是怎样的。
这在SQL中是可能的吗?它必须是2-3行代码,仅此而已。
非常感谢,SMKS
发布于 2014-10-14 22:44:42
根据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;关于这一点,有几点要注意:
发布于 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
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的动态块,它是一个编码噩梦。
我的目的是在当前的PL/SQL项目中使用m4,在这个项目中,每个过程的开始和结束都需要一些日志代码。在我看来,这种使用实际上并不适合动态SQL,而且m4只需要使用一次就可以根据需要使用调用来修改代码。
https://stackoverflow.com/questions/26369653
复制相似问题