2016-03-04 5 views
-1

Я очень новичок в postgresql. Я прочитал много сообщений в этом вопросе, но все равно не получаю правильный ответ в моей простой проблеме и продолжаю получать синтаксическую ошибку. Я пытаюсь объявить новую строковую переменную с именем parent_d и в следующих строках, пытающихся присвоить новое значение. Пожалуйста, помогите мне!Как объявить переменную и присвоить значение в postgresql?

CREATE OR REPLACE FUNCTION retrieve_parents(cid integer) RETURNS text AS $$ 
BEGIN 
    DECLARE pd text;  
    pd:= 'function'; 
    RETURN concat(cid,pd); 
END; 
$$ LANGUAGE plpgsql; 

ОШИБКА: продублировать объявление в или около «П.Д.» ЛИНИЯ 4: П.Д.: «функция»; ^

********** Ошибка **********

ОШИБКА: продублировать объявление в или около "П.Д." SQL состояние: 42601 Характер: 104

+0

какая ошибка вы получаете? \t Пожалуйста, прочитайте [** How-to-Ask **] (http://stackoverflow.com/help/how-to-ask) \t \t И вот отличное место для [** START **] (http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/), чтобы узнать, как улучшить качество вопроса и получить лучшие ответы. –

+0

Я добавил ошибку. –

+0

@JuanCarlosOropeza Вы знаете, как объявить переменную и присвоить значение в postgresql? –

ответ

2

попробовать, как этот

SQL Fiddle Demo

CREATE FUNCTION retrieve_parents(cid integer) RETURNS text AS $$ 
DECLARE pd text;  
BEGIN 

    pd:= 'function'; 
    RETURN concat(cid,pd); 

END; $$ 
LANGUAGE PLPGSQL 
+0

Большое спасибо. Он отлично работает! Могу я задать вам еще один вопрос? Является ли pd локальной переменной или глобальной? Если функция рекурсивна, это нормально? –

+0

Да, местный. Если функция является рекурсивной, это должно быть нормально. Вы всегда можете использовать значение «RAISE NOTICE» pd (%) », pd;' , чтобы распечатать значение для отладки –

+0

Я вижу. Большое спасибо. :) Ты - спасатель жизни. –

2

Я пытался сделать это как редактирование, но редактирование было отклонено как слишком маленькое.

Проблема, с которой вы сталкиваетесь, является непониманием plpgsql (несколько запутанным) block syntax. Если посмотреть на этой странице, критическая часть вы пропустили это:

[ DECLARE 
    declarations ] 

Там может быть несколько объявлений в одном разделе DECLARE. Вы можете также гнезда блоков:

DECLARE 
    c_pi CONSTANT double precision := pi(); 
    v_text text; 
BEGIN 
    DECLARE 
    v_blah text; 
    BEGIN 
    NULL; 
    END; 
END; 

Обратите внимание, что точка с запятой не является обязательной на внешнем блоке большинства.

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