1

このコードを同じ出力を持つ関数に変換するにはどうすればよいですか?

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;
4

2 に答える 2

0
create or replace function SOME_FUNCTION
RETURN VARCHAR
AS
  record_name employees%ROWTYPE;
  out_stmt varchar(4000); 
  TOO_LONG EXCEPTION;
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
    IF (LENGTH(out_stmt) < 4000) THEN
       out_stmt := out_stmt || 'Employee name: ' || record_name.complete_name || 'DEPARTMENT name: '||record_name.complete_name2;
    ELSE
       RAISE TOO_LONG;
    END IF;
  END LOOP;
  return out_stmt;
EXCEPTION
   WHEN TOO_LONG THEN
      RETURN 'OVERFLOW';
END;

Fast example, i don't know whether is some type that not have integrity limitation because not always will be varchar(4000) enought. but i heard something about this type but now i dont exactly know wether exists.

When you will work with this in app layer, must somehow format returned string.

于 2012-05-31T22:18:05.297 に答える
0
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;

上記の関数は 2 つの方法で呼び出すことができます。SQL では:

SELECT * FROM TABLE(some_employees);

または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 カーソルを返すか、(さらに良いことに) クエリをビューに入れます。

于 2012-06-01T01:07:10.260 に答える