2012-08-09 3 views
3

У меня есть следующий скрипт, из которого я хочу вывести на экран.Я хочу, чтобы мой вывод сценария pl/pgsql на экран

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(), говоря, что я должен использовать выполнение вместо этого.

ответ

3

Если вы хотите выход из функции 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 или новее.

Для одноразового использования я хотел бы просто использовать простой запрос (= тело функции без RETURN QUERY выше).

+0

Спасибо! Я попробую это. –

+0

Я не могу сделать цикл for вне функции. –

+0

Nevermind, я только заметил, что ваше решение не требует цикла for. –

5

Предполагая, что вы хотите вернуть значение функции 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; 

Примечание - оговорка FROM не является обязательным в случае, если вы выбираете из функции в отборном как netxval(sequence_name) и не имеете какую-либо фактическую таблицы, чтобы выбрать из т.е. как SELECT nextval(sequence_name) AS next_value;, с точкой зрения Oracle было бы SELECT sequence_name.nextval FROM dual; или SELECT function() FROM dual;. Нет dual в postgreSQL.

Я также думаю, что ORDER BY не является необходимым, так как мое предположение было бы, что ваша функция levenshtein(), скорее всего, вернется только одно значение в любой момент времени, и, следовательно, не будет иметь достаточно данных, чтобы ORDER.

+0

Я пока не хочу хранить его в другом столе. Я хочу видеть результат. –

+0

Вы можете использовать 'dbms_output.put_line' внутри функции, чтобы увидеть результат, но я не рекомендую его. Вместо этого используйте блок PLSQL, который я обновил в ответе, чтобы увидеть значения. См. Обновленный ответ. – Annjawn

+0

Какова функция косой черты на последней строке? –

Смежные вопросы