![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
PL/SQL - вопрос на засыпку
Rel_ © (2003-09-08 14:12:00)
Существуют ли в PL/SQL стандартные средства динамического составления строки запроса и его реализации.
Другими словами, модно ли реализовать в виде хранимой процедуры следующий дкльфовый код
SQL.Text := Format("select %s from someTable where %s", [...])
ну и потом загнать всё энто хозяйство в курсор или представление типа : select ... into ....
Rel_ (2003-09-08 14:39:00) [1]
to Vlad © И так тоже подойдёт - спасибо.
Rel_ (2003-09-08 14:38:00) [2]
to Danilka © Круто, когда Knowledge Expert есть под рукой (но я, честно говоря, даже не догадался бы по какому ключевому слову искать). Ещё раз СПАСИБО!!!
Vlad (2003-09-08 14:37:00) [3]
Не Format, а например так
str := "INSERT " || "INTO " || "TABLE " .... но вместо того что в кавычках , подставляй символьные переменные, которые формируешь динамически.
Rel_ (2003-09-08 14:34:00) [4]
to Danilka © Всё, ОГРОМНОЕ СПАСИБО, вопрос закрыт !!!
Rel_ (2003-09-08 14:32:00) [5]
to Danilka ©
Здорово, а КАК??? - просто в PL/SQL я делаю первые шаги.
Для начала, есть некая процедура
SET SomeProc(s1 varchar(50), ...., id : integer) on
...
BEGIN
SELECT someCol
INTO str
FROM some_table
WHERE code = id and name=s1;
...
END;
можно (и как правильно) заменить энто на нечто вроде ???
SET SomeProc(s1 varchar(50), ...., id : integer) on
...
BEGIN
str := Format(....,[...]);
...
END;
to DenK_vrtz © А что это такое ???
Danilka (2003-09-08 14:25:00) [6]
DenK_vrtz © (08.09.03 14:21)
можно и без него, с.м. EXECUTE IMMEDIATE
Вот примеры из документации:
DECLARE
sql_stmt VARCHAR2(200);
plsql_block VARCHAR2(500);
emp_id NUMBER(4) := 7566;
salary NUMBER(7,2);
dept_id NUMBER(2) := 50;
dept_name VARCHAR2(14) := "PERSONNEL";
location VARCHAR2(13) := "DALLAS";
emp_rec emp%ROWTYPE;
BEGIN
EXECUTE IMMEDIATE "CREATE TABLE bonus (id NUMBER, amt NUMBER)";
sql_stmt := "INSERT INTO dept VALUES (:1, :2, :3)";
EXECUTE IMMEDIATE sql_stmt USING dept_id, dept_name, location;
sql_stmt := "SELECT * FROM emp WHERE empno = :id";
EXECUTE IMMEDIATE sql_stmt INTO emp_rec USING emp_id;
plsql_block := "BEGIN emp_pkg.raise_salary(:id, :amt); END;";
EXECUTE IMMEDIATE plsql_block USING 7788, 500;
sql_stmt := "UPDATE emp SET sal = 2000 WHERE empno = :1
RETURNING sal INTO :2";
EXECUTE IMMEDIATE sql_stmt USING emp_id RETURNING INTO salary;
EXECUTE IMMEDIATE "DELETE FROM dept WHERE deptno = :num"
USING dept_id;
EXECUTE IMMEDIATE "ALTER SESSION SET SQL_TRACE TRUE";
END;
DenK_vrtz (2003-09-08 14:21:00) [7]
использовать пакет dbms_sql
Danilka (2003-09-08 14:19:00) [8]
можно :))