3

画面に出力する次のスクリプトがあります。

CREATE OR REPLACE FUNCTION randomnametest() RETURNS integer AS $$
DECLARE
    rec RECORD;
BEGIN
    FOR rec IN SELECT * FROM my_table LOOP
        SELECT levenshtein('mystring',lower('rec.Name')) ORDER BY levenshtein;
    END LOOP;

    RETURN 1;
END;
$$ LANGUAGE plpgsql;

levenshein() 関数の出力を、rec.Name と共にテーブルに取得したいと考えています。どうすればいいですか?また、levenshtein() を呼び出す行について、代わりに perform を使用する必要があるというエラーが表示されます。

4

2 に答える 2

6

insert関数の戻り値をrec.name別のテーブルに入れたいとします。これがあなたができることです(最初createの表new_tab)-

SELECT levenshtein('mystring',lower(rec.Name)) AS L_val;
INSERT INTO new_tab (L_val, rec.name);

上記の使用法を以下に示します。

値を表示するために使用できると思いRAISE INFO 'This is %', rec.name;ます。

CREATE OR REPLACE FUNCTION randomnametest() RETURNS integer AS $$

DECLARE
    rec RECORD;
BEGIN
    FOR rec IN SELECT * FROM my_table LOOP
        SELECT levenshtein('mystring',lower(rec.Name))
         AS L_val;

       RAISE INFO '%   -   %', L_val, rec.name; 
    END LOOP;

    RETURN 1;
END;
$$ LANGUAGE plpgsql;

- FROMselect like の関数から選択し、netxval(sequence_name)そこから選択する実際のテーブルがない場合、つまり like SELECT nextval(sequence_name) AS next_value;、Oracle 用語ではSELECT sequence_name.nextval FROM dual;orとなる場合、句はオプションですSELECT function() FROM dual;dualにはありませんpostgreSQL

また、関数は常に 1 つの値のみを返す可能性が高く、十分なデータがORDER BYないため、 は必要ないと思います。levenshtein()ORDER

于 2012-08-09T19:03:16.413 に答える
4

タイトルにあるような plpgsql 関数からの出力が必要な場合:

CREATE OR REPLACE FUNCTION randomnametest(_mystring text)
  RETURNS TABLE (l_dist int, name text) AS
$BODY$
BEGIN
    RETURN QUERY
    SELECT levenshtein(_mystring, lower(t.name)), t.name
    FROM   my_table t
    ORDER  BY 1;
END;
$$ LANGUAGE plpgsql;
  • でテーブルを宣言しますRETURNS TABLE
  • RETURN QUERY関数からレコードを返すために使用します。
  • OUTクエリで列名をテーブル修飾することにより、列名とパラメーター (RETURNS TABLE句から)の間の名前の競合を回避します。OUTパラメータは関数本体のどこにでも表示されます。
  • これをより便利にするために、関数のパラメーターと比較する文字列を作成しました。

他の方法もありますが、これが最も効果的なタスクです。PostgreSQL 8.4 以降が必要です。

1 回限りの使用では、単純なクエリ (= 上記のない関数本体) を使用することを検討しますRETURN QUERY

于 2012-08-09T20:51:46.923 に答える