Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从代码块创建函数_Sql_Oracle_Function_Plsql - Fatal编程技术网

Sql 从代码块创建函数

Sql 从代码块创建函数,sql,oracle,function,plsql,Sql,Oracle,Function,Plsql,如何将此代码转换为具有相同输出的函数 declare record_name employees%ROWTYPE; begin FOR record_name IN (SELECT (a.first_name || ' ' || a.last_name) complete_name, b.DEPARTMENT_NAME complete_name2 FROM employees a , departm

如何将此代码转换为具有相同输出的函数

declare
  record_name employees%ROWTYPE; 
begin
  FOR record_name IN (SELECT (a.first_name || ' ' || a.last_name) complete_name,
                      b.DEPARTMENT_NAME complete_name2
                     FROM employees a , departments b
                     WHERE ROWNUM < 1000 and a.DEPARTMENT_ID=b.DEPARTMENT_ID)
  LOOP 
    DBMS_OUTPUT.PUT_LINE('Employee name: ' || record_name.complete_name 
                           ||'DEPARTMENT name: '||record_name.complete_name2);
  END LOOP;
END;
举个简单的例子,我不知道是否有某种类型没有完整性限制,因为不总是varchar4000-enough。但是我听说了一些关于这种类型的东西,但现在我不知道它是否存在

当你们使用这个应用层时,你们必须以某种方式格式化返回的字符串

CREATE TYPE some_employees_record IS RECORD
  (emp_name VARCHAR2(4000)
  ,dept_name VARCHAR2(4000));
CREATE TYPE employees_tab_type IS TABLE OF some_employees_record;

CREATE OR REPLACE
FUNCTION some_employees
RETURN employees_tab_type
PIPELINED
IS
  rec some_employees_record; 
BEGIN
  FOR record_name IN (SELECT (a.first_name || ' ' || a.last_name) complete_name,
                      b.DEPARTMENT_NAME complete_name2
                     FROM employees a , departments b
                     WHERE ROWNUM < 1000 and a.DEPARTMENT_ID=b.DEPARTMENT_ID)
  LOOP
    rec.emp_name := record_name.complete_name;
    rec.dept_name := record_name.complete_name2;
    PIPE ROW (rec);
  END LOOP;
  RETURN;
END;
或在PL/SQL中:

DECLARE
  rt employees_tab_type;
BEGIN
  rt := some_employees;
  FOR i IN 1..rt.COUNT LOOP
    DBMS_OUTPUT.put_line(rt(i).emp_name || ', ' || rt(i).dept_name);
  END LOOP;
END;
OT:如果记录数超过999,您是否意识到查询将返回一组有效的随机不确定的999条记录


顺便说一句,这只是出于示例目的。如果您唯一的需求是让函数运行查询,我不会这样做。我会返回一个ref游标,或者更好地将查询放在视图中。

从Oracle 10g开始,最大varchar为4000。还有,你不认为“+”号赢了吗;连接不起作用?[out_stmt:=out_stmt+“Employee name:”]-应该是| |可能还需要一个异常处理程序,以防溢出out_stmt变量。您是只想打印还是希望函数返回记录集以供进一步操作?对于前者,使用@Sajmon给出的答案,用Put_行替换累积连接。对于后者,您需要创建一个表值函数。
SELECT * FROM TABLE(some_employees);
DECLARE
  rt employees_tab_type;
BEGIN
  rt := some_employees;
  FOR i IN 1..rt.COUNT LOOP
    DBMS_OUTPUT.put_line(rt(i).emp_name || ', ' || rt(i).dept_name);
  END LOOP;
END;