Форум программистов, компьютерный форум, киберфорум
Oracle
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/19: Рейтинг темы: голосов - 19, средняя оценка - 4.74
0 / 0 / 0
Регистрация: 25.02.2009
Сообщений: 16
1

Динамический SQL

28.05.2009, 18:04. Показов 3593. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Подскажите, как написать процедуру,
которая для какой либо схемы из базы данных,
выбирала бы все ее таблицы и копировала данные из них
в один фаил.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.05.2009, 18:04
Ответы с готовыми решениями:

Это динамический SQL или PL/SQL?
declare type namelist is table of varchar2(15); enames namelist; bonus_amt number := 50; ...

Динамический SQL
Дорогие коллеги у меня проблема: Имеется :динамически передаваемое имя таблцы -(Varchar2(50));...

динамический sql
Пытаюсь создать следующую ф-ию (пока задействованы не все параметры, но суть не в этом): CREATE OR...

Динамический запрос sql
Добрый день! Подскажите пожалуйста по созданию динамического запроса. Создаю запрос в C++ Builder 6...

7
GenaV
29.05.2009, 17:32 2
По-моему, самое простое выполнить ЭКСПОРТ ?!
0 / 0 / 0
Регистрация: 25.02.2009
Сообщений: 16
29.05.2009, 18:52  [ТС] 3
Мне нужна именно процедура
на динамическом SQL
0
0 / 0 / 2
Регистрация: 08.04.2009
Сообщений: 271
01.06.2009, 19:11 4
Извините, это всего лишь подсказка, потому, что написать таковую программу это довольно много усилий.
( Я бы не стал писать эту 'бодягу' на PL/SQL. Было дело, когда то в качестве баловства писал это на OCI. Если Вы знаете язык C и эта программа нужна для множественного использования - рекомендую. )

Если все-же PL/SQL, то лучше из программы на стороне клиента ( ранее на форуме уже обсуждался вопрос : пишу на сервере ).

SELECT table_name FROM dba_tables WHERE owner = '...' выдаст список таблиц схемы а далее видимо пакет DBMS_SQL.

В настоящее время пакет DBMS_SQL может использоваться в программах, выполняемых на стороне клиента, а native динамический SQL - нет. Каждый вызов пакета DBMS_SQL из клиентской программы транслируется в PL/SQL remote procedure call (RPC); эти вызовы осуществляются когда вы связываете переменные, определяете переменную или выполняете предложение.

Поддержка DESCRIBE

Процедура DESCRIBE_COLUMNS пакета DBMS_SQL может быть использована для получения описания столбцов курсора открытого и разобранного с помощью пакета DBMS_SQL. Эти действия подобны действию команды DESCRIBE в среде SQL*Plus. Native динамический SQL не имеет такого, подобного DESCRIBE средства.

Хотя список столбцов можно получить и из dba_tab_columns
(И все-же, PL/SQL для этой задачи - плохое решение )
0
0 / 0 / 0
Регистрация: 25.02.2009
Сообщений: 16
02.06.2009, 17:58  [ТС] 5
Что тут не так объясните пожалуйста!
Oracle 11 SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
(username IN VARCHAR2, p_mode IN VARCHAR2, p_delim IN VARCHAR2)
IS
   fid                    UTL_FILE.file_type;
   c_cursor               INTEGER;
   my_ret                 INTEGER;
   f1                     PLS_INTEGER        := 1;
   f2                     PLS_INTEGER        := 0;
   my_date                DATE;
   my_varchar2            VARCHAR2 (2000);
   my_number              NUMBER;
   my_line                VARCHAR2 (2000)    := ''
BEGIN
   fid := UTL_FILE.fopen ('C:   emp', 'fname.log', p_mode);
   FOR i IN  (SELECT table_name
                FROM sys.all_tables
               WHERE owner = username)
   LOOP
      c_cursor := DBMS_SQL.open_cursor;
      DBMS_SQL.parse (c_cursor,'select *FROM '|| username || '.'|| i.table_name, DBMS_SQL.native);
      FOR vw_cols IN  (SELECT column_name
                         FROM sys.all_tab_columns
                        WHERE table_name = i.table_name
                          AND owner = username)
      LOOP
         DBMS_SQL.define_column (c_cursor, f1, vw_cols.column_name, 25);
         f1 :=   f1 + 1;
      END LOOP;
      my_ret := DBMS_SQL.EXECUTE (c_cursor);
      WHILE DBMS_SQL.fetch_rows (c_cursor) > 0
      LOOP
         f1 := 1;
         FOR vw_types IN  (SELECT data_type
                             FROM sys.all_tab_columns
                            WHERE table_name = i.table_name
                              AND owner = username)
         LOOP
            IF f2 = 0
            THEN
               IF vw_types.data_type = 'DATE'
               THEN
                  DBMS_SQL.column_value (c_cursor, f1, my_date);
                  my_line := TO_CHAR (my_date);
                  f1 :=   f1 + 1;
                  f2 :=   f2 + 1;
               ELSIF vw_types.data_type = 'VARCHAR2'
               THEN
                  DBMS_SQL.column_value (c_cursor, f1, my_varchar2);
                  my_line := my_varchar2;
                  f1 :=   f1 + 1;
                  f2 :=   f2 + 1;
               ELSIF vw_types.data_type = 'NUMBER'
               THEN
                  DBMS_SQL.column_value (c_cursor, f1, my_number);
                  my_line := TO_CHAR (my_number);
                  f1 :=   f1 + 1;
                  f2 :=   f2 + 1;
               ELSE
                  NULL;
               END IF;
            ELSE
               IF vw_types.data_type = 'DATE'
               THEN
                  DBMS_SQL.column_value (c_cursor, f1, my_date);
                  my_line :=    my_line|| p_delim
                             || TO_CHAR (my_date);
                  f1 :=   f1 + 1;
               ELSIF vw_types.data_type = 'VARCHAR2'
               THEN
                  DBMS_SQL.column_value (c_cursor, f1, my_varchar2);
                  my_line :=    my_line|| p_delim
                             || my_varchar2;
                  f1 :=   f1 + 1;
               ELSIF vw_types.data_type = 'NUMBER'
               THEN
                  DBMS_SQL.column_value (c_cursor, f1, my_number);
                  my_line :=    my_line|| p_delim
                             || TO_CHAR (my_number);
                  f1 :=   f1 + 1;
               ELSE
                  NULL;
               END IF;
            END IF;
         END LOOP;
 
         UTL_FILE.put_line (fid, my_line);
         my_line := ''
      END LOOP;
   END LOOP;
 
   UTL_FILE.fclose (fid);
   DBMS_SQL.close_cursor (c_cursor);
END;
0
0 / 0 / 2
Регистрация: 08.04.2009
Сообщений: 271
02.06.2009, 18:45 6
Один из возможных вариантов проблемы был рассмотрен в теме 'Экспорт в Access'. Посмотрите, поскольку это типичный случай.
0
0 / 0 / 2
Регистрация: 08.04.2009
Сообщений: 271
02.06.2009, 18:57 7
И еще, если Вы все таки упорно пытаетесь писать на сервере, то проще использовать не DBMS_SQL, а EXECUTE IMMEDIATE. Примеры :
Oracle 11 SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
CREATE OR REPLACE FUNCTION get_num_of_employees (
                                  table_name VARCHAR2,
                                  job VARCHAR2)
RETURN NUMBER IS
    query_str          VARCHAR2(1000);
    num_of_employees    NUMBER;
BEGIN
    query_str := 'SELECT COUNT(*) FROM ' || table_name 
        || ' WHERE job = :job_title'
    EXECUTE IMMEDIATE query_str
        INTO num_of_employees
        USING job;
    RETURN num_of_employees;
END;
/
 
CREATE OR REPLACE PROCEDURE list_employees(
                 table_name VARCHAR2,
                 job VARCHAR2)
IS
    TYPE cur_typ IS REF CURSOR;
    c           cur_typ;
    query_str   VARCHAR2(1000);
    emp_name    VARCHAR2(20);
    emp_num     NUMBER;
BEGIN
    query_str := 'SELECT ename, empno FROM ' || table_name 
        || ' WHERE job = :job_title'
    -- find employees who perform the specified job
    OPEN c FOR query_str USING job;
    LOOP
        FETCH c INTO emp_name, emp_num;
        EXIT WHEN c%NOTFOUND;
        -- process row here
    END LOOP;
    CLOSE c;
END;
/
0
0 / 0 / 0
Регистрация: 25.02.2009
Сообщений: 16
02.06.2009, 19:33  [ТС] 8
большое спасибо
0
02.06.2009, 19:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.06.2009, 19:33
Помогаю со студенческими работами здесь

AJAX + php + sql Динамический список
Добрый день уважаемые форумчане. Есть БД со столбцами id, user_id, filial_name, type. Есть форма....

Динамический sql запрос с 4-мя независимыми условиями
Всем привет. Возникла следущая проблема-нужно составить динамический sql запрос, который может...

Несколько CheckBox и динамический SQL запрос
Всем доброго времени! Уважаемые форумчане! Прошу помощи в такой головоломке: Есть форма на...

Как создать динамический запрос SQL в процедуре?
Объясните пожалуйста мне как создать подобный запрос? Перечитал кучу статей, везде написано по...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru