6

これを行う関数を作成しようとしています:

drop table t_rv_openitem;
select * into t_rv_openitem from rv_openitem;
select * from t_rv_openitem;

PostgreSQL の関数に関しては、時々混乱し、次のエラーが発生します。

エラーが発生しました:

エラー: 「DROP」行またはその付近で構文エラーが発生しました 行 3: DROP TABLE t_rv_openitem;

これは簡単な作業のように思えますが、これを理解しようとして髪を引っ張っています。

完全な関数 create ステートメントは次のとおりです。

CREATE OR REPLACE FUNCTION adempiere.update_t_rv_openitem()
  RETURNS rv_openitem AS
$BODY$

Drop table t_rv_openitem;
select * into t_rv_openitem from rv_openitem;
select * From t_rv_openitem;

$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION adempiere.update_t_rv_openitem() OWNER TO adempiere; 
4

1 に答える 1

4

BEGIN と END を追加するだけです

CREATE OR REPLACE FUNCTION adempiere.update_t_rv_openitem()
  RETURNS rv_openitem AS
$BODY$

BEGIN -- ADD THIS

Drop table t_rv_openitem;
select * into t_rv_openitem from rv_openitem;
select * From t_rv_openitem;

END; -- AND THIS

$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION adempiere.update_t_rv_openitem() OWNER TO adempiere; 

を使用している場合は BEGIN および END ブロックは必要ありませんが、使用してLANGUAGE sqlいる場合はそれらが必要ですLANGUAGE plpgsql

アップデート

についてERROR: syntax error at "t_rv_openitem" DETAIL: Expected record variable...。コードに構文エラーはありません。これを変更するだけです。

select * into t_rv_openitem from rv_openitem;

これに:

create table t_rv_openitem as
select * from rv_openitem;

を使用したテーブルの作成SELECT * INTO tablehere FROM tableSourceは、PLPGSQL の外部で使用している場合にのみ機能します。そのコード構造体が PLPGSQL 内にある場合、セマンティックは異なります。つまり、次のことを意味します。

SELECT * INTO declaredVariableHere FROM tableSource;

スタンドアロンのステートメントと PLPGSQL 内の両方でテーブルの作成を機能させるには、次を使用します。

CREATE TABLE AS SELECT * FROM tableSourceHere;
于 2012-04-11T03:21:58.227 に答える