sql - 如何创建带参数的 SQL 函数?

标签 sql oracle plsql oracle-apex

以下代码根据“28”的输入返回一个字段(一个字符串)。

SELECT data.id, LTRIM(SYS_CONNECT_BY_PATH(name, ', '),',') conc_names
  FROM (
     SELECT id, name, ROW_NUMBER() OVER (order by name) rownumber, COUNT(*) OVER () cnt
      FROM (
         SELECT es.EVENT_ID as id, s.SERVICE_NAME as name FROM DT_SERVICES s
            JOIN DT_EVENT_SERVICE es ON s.SERVICE_ID = es.SERVICE_ID
         WHERE es.EVENT_ID = 28
      )
) data
WHERE rownumber = cnt
START WITH rownumber = 1
CONNECT BY PRIOR rownumber = rownumber-1;

我如何创建一个 SQL 函数,以便我可以传入任何数字(而不是 28),并且该函数将返回该选择的结果?

我尝试创建一个,但我不断收到编译错误。

当前创建函数的SQL

create or replace function "DT_SERVICE_STRING" (id in VARCHAR2)
  return VARCHAR2 is
begin
  DECLARE 
     result VARCHAR(200);
  SELECT data.id, LTRIM(SYS_CONNECT_BY_PATH(name, ', '),',') conc_names
    INTO result
    FROM (
      SELECT id, name, ROW_NUMBER() OVER (order by name) rownumber, COUNT(*) OVER () cnt
      FROM (
        SELECT es.EVENT_ID as id, s.SERVICE_NAME as name FROM DT_SERVICES s
        JOIN DT_EVENT_SERVICE es ON s.SERVICE_ID = es.SERVICE_ID
        WHERE es.EVENT_ID = id
      )
  ) data
  WHERE rownumber = cnt
  START WITH rownumber = 1
  CONNECT BY PRIOR rownumber = rownumber-1;

  return result;
end;​

错误:
编译失败,第 7 行 (15:22:21) PLS-00103:在期望以下其中一项时遇到符号“SELECT”:开始函数杂注过程子类型类型当前光标删除之前存在

最佳答案

假设您想要一个可从 SQL 语句调用的 PL/SQL 函数(您不能在 SQL 中定义函数),听起来您想要类似的东西

CREATE OR REPLACE FUNCTION get_conc_names( p_event_id IN dt_event_service.event_id%type )
  RETURN VARCHAR2
IS
  l_conc_names VARCHAR2(32676); 
  -- You may want a smaller variable if you know the result will be smaller
BEGIN
  SELECT LTRIM(SYS_CONNECT_BY_PATH(name, ', '),',') conc_names
    INTO l_conc_names
    FROM (
      SELECT id, name, ROW_NUMBER() OVER (order by name) rownumber, COUNT(*) OVER () cnt
        FROM (SELECT es.EVENT_ID as id, s.SERVICE_NAME as name 
                FROM DT_SERVICES s
                     JOIN DT_EVENT_SERVICE es ON s.SERVICE_ID = es.SERVICE_ID
               WHERE es.EVENT_ID = p_event_id )
          ) data
   WHERE rownumber = cnt
   START WITH rownumber = 1
 CONNECT BY PRIOR rownumber = rownumber-1;
  RETURN l_conc_names;
END;

根据您刚刚发布的代码,看来您只需要删除 DECLARE并移动局部变量 result 的声明之前BEGINIS之后。

关于sql - 如何创建带参数的 SQL 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9708656/

相关文章:

sql - 查询仅具有非事件推送 token 的用户

sql - 如何获取行的最后更改时间戳?

sql - 如何着手优化 Oracle 查询?

java - 使用 DBMS_CRYPTO 但使用 dbms_obfuscation_toolkit 时出错

oracle - 关于pl/sql存储程序文本的问题

plsql - PL/SQL 中的 AND 条件 IF-THEN-ELSE 语句

mysql - 从表中检索二级友谊并排除一级 friend

PHP-MySQL 删除记录

sql - 并排加入两个查询

c# - 使用 Oracle.ManagedDataAccess 异常连接到 Oracle