2014-02-16 3 views
0

Я пытаюсь присвоить число строк целому числу переменной в plpgsql 9.1.
Попробуйте 1: ничто не назначаетсяНевозможно присвоить количество строк переменной в plpgsql

maz int := (SELECT count(col1) FROM table WHERE col1 = quote_literal(val1)); 

Попробуйте 2: ЗНАКОМСТВО ошибку вблизи INTO

EXECUTE 'SELECT count(col1) FROM table 
     WHERE col1 = quote_literal(val1) INTO maz'; 

EDIT: удален "в", как это было опечатка.

+0

Вам нужно было бы опубликовать * полное * определение функции, включая заголовок, чтобы быть понятным здесь. –

ответ

3

Ваши примеры немного беспорядочны.

Первый пример неверен - возможно, неправильное использование ключевого слова IN и quote_literal() абсолютно бесполезно в этом контексте. Второй, вероятно, тоже неправильный - если val1 является переменной. переменные plpgsql не отображаются внутри строки SQL в операторе EXECUTE. Следующий выпуск: INTO в строке SQL.

postgres=# do $$ 
      DECLARE rc int; 
        val1 varchar := 'Hello'; 
      BEGIN 
      rc := (SELECT count(*) FROM xxx WHERE xxx.v = val1); 
      RAISE NOTICE '%', rc; 
      EXECUTE 'SELECT count(*) FROM xxx WHERE xxx.v = $1' 
      USING val1 INTO rc; 
      RAISE NOTICE '%', rc; 
      END; 
      $$; 
NOTICE: 1 
NOTICE: 1 
DO 

quote_literal() обычно необходимо для динамического SQL, когда вы не можете использовать пункт USING. В вашем примере:

EXECUTE 'SELECT count(*) FROM xxx WHERE xxx.v = ' || quote_literal(val1) 
INTO ... 

Он защищает от инъекции SQL и обеспечивает надлежащее экранирование.

Современные релизы имеют format() функцию:

EXECUTE format('SELECT count(*) FROM xxx WHERE xxx.v = %L', val1) INTO ... 

Но EXECUTE ... USING должно быть предпочтительным.

+0

@ Erwin Я использую quote_literal либерально, кроме других мер для защиты от SQL-инъекций и других угроз, но я был бы очень признателен, если бы вы могли предоставить больше указаний на то же самое. Спасибо – vedic

+0

@vedic: указатели на то, как защитить от SQL-инъекций? [Этот связанный ответ содержит более подробную информацию.] (Http://stackoverflow.com/questions/10705616/table-name-as-a-postgresql-function-parameter/10711349#10711349) Или [попробуйте поиск.] (Http: //stackoverflow.com/search?q=[plpgsql]+execute+%22sql+injection%22) –

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