PostgreSQL - как да execute-на произволен script??

8 отговора 562 прегледа
#1

PostgreSQL - как да execute-на произволен script??

Питанката е следната : Има ли възможност синтаксиса на Postgre SQL да execut-на произволен скрипт? Идеята ми е скрипта да е параметър на дадена функция и вътре да се изпълнява. Това може да се направи, ако предварително скрипта бъде записан във файл, доколкото прочетох (exec script) или в самото приложение, което се връзва към базата (например аз пиша на Делфи и мога от там да го контролирам). Въпроса е дали мога да правя това и в самата база?
Мерси на отзивчивите :)

Отговор
в отговор на VladoVasilev #2

Re: PostgreSQL - как да execute-на произволен script??

Още малко въпроси, макар че липсват отогвори :(. Execute immediate - как действа този sattement, може би това е нешото, което ми трябва, но не мога са го подкарам. Като интерфейс използвам pgAdmin III, съответно тествам всичко там. Пробвах да направя ф-ция и вътре да викам "execute immediately $1...", но нещо не мога да уцеля синатксиса. Или не е това идеята? Някой може ли да разясни - същия statement се поддържа и в Oracle 8.
Мерси...

Отговор
в отговор на VladoVasilev #3

Re: PostgreSQL - как да execute-на произволен scri

за да стартираш нещо външно няма да можеш да го направиш с plpgsql

ще ти трябва някакъв друг език plperl/plpython/plphp/pltcl и по-специално untrusted версиите или C/C++ (вероятно и на делфи може, ама нямам идеа как става)

и от функцията в зависимост от това какъв език си си избрал по различен начин се извиква външната команда

Отговор
в отговор на phpGuru #4

Re: PostgreSQL - как да execute-на произволен scri

Това postgres сега го азучавам и определено ъсм повече от начинаещ. Дай пример - конкретен език и синтаксис, ако може :)

Отговор
в отговор на VladoVasilev #5

Re: PostgreSQL - как да execute-на произволен scri

aми първо какво точно искаш да стартираш и сигурен ли си, че искаш! :-))
___________________________
ceco@base:~$ createlang plperlu test
ceco@base:~$ psql test
Welcome to psql 8.0.3, the PostgreSQL interactive terminal.

Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit

test=# CREATE OR REPLACE FUNCTION run() RETURNS text AS $$
test$# return `ls /`;
test$# $$ LANGUAGE plperlu;
CREATE FUNCTION
test=# select run();
run
---------
backups
bin
boot
cdrom
dev
etc
home
initrd
initrd.img
lib
lost+found
media
mnt
opt
proc
root
sbin
srv
sys
tmp
usr
var
vmlinuz

(1 row)

test=#

___________________________

това показва на моя компютър ползвайки plperlu

по-добре кажи по-конкретно какво мислиш да правиш защото тва определено доста рядко има смисъл

Отговор
в отговор на phpGuru #6

Малък напредък

Искам да направя функция с параметри, която да създава нова таблица в базата, на този етап структурата ще е константа, само името на новата таблица е параметър. Ето какво успях да направя:

CREATE OR REPLACE FUNCTION CreateTable(tblname "varchar")
RETURNS void AS
$BODY$
declare var_script varchar(1000);
begin
var_script := "create table " || $1 || "(id int8)";
execute var_script;
commit work;
end;$BODY$
LANGUAGE 'plpgsql' VOLATILE;

И вече имам новата функция! После обаче опитах да изпълня [SELECT CREATETABLE("Table!")] и ми даде грешка:
---

ERROR: column "create table " does not exist
CONTEXT: SQL statement "SELECT "create table " || $1 || "(id int8)""
PL/pgSQL function "createtable" line 3 at assignment

Отговор
в отговор на VladoVasilev #7

Re: Малък напредък

Първо, замени двойните кавички с единични и второ, разкарай това commit work и си готов.

Everything louder than everything else...
Отговор
в отговор на VladoVasilev #8

Re: Малък напредък

проблемът ти е в кавички! :-)

в PG " се използва за ограждане на имана на полета/таблици и т.н.

текстови низове (strings) се ограждат в апострофи '

за да ти работи функцията пробвай така

CREATE OR REPLACE FUNCTION CreateTable(tblname varchar)
RETURNS void AS
$BODY$
declare var_script varchar(1000);
begin
var_script := 'create table ' || $1 || '(id int8)';
execute var_script;
end;$BODY$
LANGUAGE 'plpgsql' VOLATILE;

махнал съм и това commit work, тук би ти дало само грешкка :-)

Отговор
в отговор на Dakota #9

Re: Малък напредък

хе аз нещо съм се разсеял и не съм видял твоя отговор :-)

Отговор