【问题标题】:Can a Sql statement be encapsulated into a sub function for better readability?能否将Sql语句封装成子函数以提高可读性?
【发布时间】:2011-07-11 10:11:45
【问题描述】:

我尝试通过关注Tony Andrews example 来实现一个表函数。但我的 Sql 语句将有几行长(> 20)并且还将包含参数。是否可以将 Sql 语句封装在其他地方并从 main 函数中引用它以使所有内容更具可读性?

在传统的编程语言中,我会将原始 Sql 分配到一个字符串中并根据需要替换参数。

【问题讨论】:

  • 20 行不是很长,但您始终可以将查询隐藏在视图后面。 (只是不要在视图上堆叠几层视图)。
  • 确实我先尝试使用视图,但与参数化的 Sql 相比,它的速度很慢。因此我选择编写一个函数:-)
  • what 主函数中引用它。您应该详细说明您想如何使用该语句(或执行它返回的数据),因为在当前形式下,这个问题是无法回答的。

标签: sql oracle function


【解决方案1】:

是的,您可以:

--declare variables
TYPE curref is REF CURSOR;
c1 curref;

q VARCHAR2(2000);

--save query to string variable
q:='<insert 20 line query here>';

--open cursor 
OPEN c1 FOR q;

--then, work on cursor rows, one by one

请注意,“q”可能非常复杂,具有串联的参数值(或可以存储为单独 varchar 变量的子查询):

q:='
    select distinct
        fn.BASENAME as name
        ,h.PARENT_ID as "admin_place_id"
        ,h.lev as "admin_level"
    FROM (
        SELECT CHILD_ID, PARENT_ID, level lev
        from '||schema||'.NT_ADMIN_GRAPH
        START WITH CHILD_ID='||q_sub2||'
        CONNECT BY CHILD_ID=PRIOR PARENT_ID
    UNION ALL
        SELECT null, '||q_sub2||', 0
        FROM DUAL
    ) h
    '
    ||q_sub||
    '
    ORDER BY h.lev asc    
';

有关如何实现此功能的更多示例,请参阅Oracle's documentation

【讨论】:

  • 非常感谢。这不完全是我做的方式,因为有很多字符串连接。但是你的回答把我引向了光标。
【解决方案2】:

灵感来自 drapkin11 我found 一个使用光标的解决方案:

CREATE OR REPLACE Function TotalIncome( name_in IN varchar2 )
RETURN varchar2
IS
    total_val number(6);

    cursor c1 is
      select monthly_income
      from employees
      where name = name_in;

BEGIN
    total_val := 0;
    FOR employee_rec in c1
    LOOP
        total_val := total_val + employee_rec.monthly_income;
    END LOOP;
    RETURN total_val;
END;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-12
    • 1970-01-01
    • 2017-02-10
    • 2019-12-29
    • 1970-01-01
    相关资源
    最近更新 更多