所以我一直在研究关于宏的C编程并使用它们,但在我的工作中我经常使用PL / sql而且我想知道是否有某种方法可以在PL / sql中执行相同类型的操作.现在我让它调用一个具有3个不同值的函数,然后返回一个值,但函数非常简单,我想我可以从原始存储过程内部完成.在C中,宏是一行(或多行)代码,它们在编译时完全被调用替换,但它比反复调用函数更有效.
C的例子:
#define query(fieldValue,Attribute,Table) (select fieldValue from Table where record = Attribute)
当在代码体中调用时,查询(值,值,值)将完全被select语句替换.
只是一个粗略的例子,它可能出现在C中,因为我真的不确定它在PL / sql中的表现.
非常感谢,
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创建它)