2016-06-14 1 views
2
CREATE OR REPLACE FUNCTION get_biggest_order() 
RETURNS TABLE(CustomerID int,Sum float) AS 
$$ 
DECLARE 
    rec RECORD; 
mycursor CURSOR FOR WITH TOTAL(TotalPerCustomer) AS (SELECT SUM(TotalDue) FROM SalesOrderHeader GROUP BY SalesOrderHeader.CustomerID), 
    MAX(Max) AS (SELECT MAX(TotalPerCustomer) FROM TOTAL) 
    SELECT SalesOrderHeader.CustomerID,SUM(TotalDue) AS S FROM SalesOrderHeader,MAX GROUP BY SalesOrderHeader.CustomerID,Max HAVING SUM(TotalDue)=Max; 
    BEGIN 
     CREATE TEMP TABLE Results2(CustomerID int,Sum float); 
     -- Open the cursor 
     OPEN mycursor; 
     LOOP 
      -- fetch row into the film 
      FETCH mycursor INTO rec; 
      -- exit when no more row to fetch 
      EXIT WHEN NOT FOUND; 
      -- build the output 
      INSERT INTO Results2 SELECT (rec).*; 
     END LOOP; 
    -- Close the cursor 
     CLOSE mycursor; 
     RETURN QUERY EXECUTE 'SELECT * FROM Results2'; 
    END; $$ 
LANGUAGE plpgsql; 

SELECT get_biggest_order(); 

Postgresの中で次のエラーを取得する:私は、カーソルを使用して表形式でカーソル内のクエリを返すようにしようとしていますpostgresqlに「レコードタイプが登録されていません」というエラーが表示されます。なにが問題ですか?

ERROR: record type has not been registered 
CONTEXT: SQL statement "INSERT INTO Results2 SELECT (rec).*" 
PL/pgSQL function get_biggest_order() line 17 at SQL statement 
********** Error ********** 

ERROR: record type has not been registered 
SQL state: 42809 
Context: SQL statement "INSERT INTO Results2 SELECT (rec).*" 
PL/pgSQL function get_biggest_order() line 17 at SQL statement 

。どうやら、何かがレコード型変数に間違っていて、それを関数を使って返すtempテーブルに挿入することはできません。なにが問題ですか?

+0

select文だけを実行する関数と一時表を作成するのはなぜですか? –

+0

それは割り当てで、私は同じ考えを持っていた、haha :) – Kores

+0

私は最近、教師が何を考えているのだろう...笑 –

答えて

1

recは型なしのレコードなので、SELECT (rec).*VALUES (rec.CustomerID, rec.S)に置き換えてください。

関連する問題