Как выполнить несколько операторов DML в переменной последовательно с помощью CX_ORCACLE -- python-3.x поле с участием oracle поле с участием cx-oracle пол Связанный проблема

How to execute multiple DML statements in a variable sequentially using cx_Oracle


0
vote

проблема

русский

У меня есть переменный сценарий, который имеет два-три оператора DML. Я хочу запустить их последовательно после подключения к моему Oracle DB. Я попробовал ниже, но он не сразу с ошибкой ниже

 <код>     c.execute(SCRIPT) cx_Oracle.DatabaseError: ORA-00933: SQL command not properly ended   

Ниже приведен кусок кода.

 <код> SCRIPT="""UPDATE IND_AFRO.DRIVER    SET Emp_Id = 1000, update_user_id = 'RIBST-4059'  WHERE Emp_Id IN (SELECT Emp_Id                     FROM IND_AFRO.DRIVER Ddq                    WHERE     NOT EXISTS                                  (SELECT 1                                     FROM IND_AFRO_AF.EMPLOYEE                                    WHERE Emp_Id = Ddq.Emp_Id)                          AND Functional_Area_Cd = 'DC');  UPDATE IND_AFRO.APPOINTMENTS    SET Emp_Id = 1000, update_user_id = 'RIBST-4059'  WHERE Emp_Id IN (SELECT Emp_Id                     FROM IND_AFRO.APPOINTMENTS Ddq                    WHERE NOT EXISTS                              (SELECT 1                                 FROM IND_AFRO_AF.EMP                                WHERE Emp_Id = Ddq.Emp_Id));  UPDATE IND_AFRO.ar_application_for_aid a    SET a.EMP_ID = 1000  WHERE NOT EXISTS            (SELECT 1               FROM IND_AFRO_AF.EMP              WHERE emp_id = a.emp_id);"""      conn = cx_Oracle.connect(user=r'SYSTEM', password='ssadmin', dsn=CONNECTION)     c = conn.cursor()     c.execute(SCRIPT)     c.close()   
Английский оригинал

I have a variable SCRIPT which has two to three DML statements. I want to run them sequentially after connecting to my Oracle DB. I have tried the below but it is failing with below error

    c.execute(SCRIPT) cx_Oracle.DatabaseError: ORA-00933: SQL command not properly ended 

Below is the piece of code tried.

SCRIPT="""UPDATE IND_AFRO.DRIVER    SET Emp_Id = 1000, update_user_id = 'RIBST-4059'  WHERE Emp_Id IN (SELECT Emp_Id                     FROM IND_AFRO.DRIVER Ddq                    WHERE     NOT EXISTS                                  (SELECT 1                                     FROM IND_AFRO_AF.EMPLOYEE                                    WHERE Emp_Id = Ddq.Emp_Id)                          AND Functional_Area_Cd = 'DC');  UPDATE IND_AFRO.APPOINTMENTS    SET Emp_Id = 1000, update_user_id = 'RIBST-4059'  WHERE Emp_Id IN (SELECT Emp_Id                     FROM IND_AFRO.APPOINTMENTS Ddq                    WHERE NOT EXISTS                              (SELECT 1                                 FROM IND_AFRO_AF.EMP                                WHERE Emp_Id = Ddq.Emp_Id));  UPDATE IND_AFRO.ar_application_for_aid a    SET a.EMP_ID = 1000  WHERE NOT EXISTS            (SELECT 1               FROM IND_AFRO_AF.EMP              WHERE emp_id = a.emp_id);"""      conn = cx_Oracle.connect(user=r'SYSTEM', password='ssadmin', dsn=CONNECTION)     c = conn.cursor()     c.execute(SCRIPT)     c.close() 
</div
        

Список ответов

2
 
vote
vote
Лучший ответ
 

<код> execute() и <код> executemany() функции работают только на одном операторе SQL или PL / SQL.

Вы можете обернуть три оператора в блоке PL / SQL Begin / End Black, например:

 <код> SQL> begin   2  insert into test values(1);   3  update test set a = 2;   4  end;   5  /  PL/SQL procedure successfully completed.   

В качестве альтернативы вы можете разложить вашу строку в отдельные заявления. Если утверждения возникают из файла, вы можете написать обертку для чтения файла и выполнить каждое утверждение. Это намного проще, если вы ограничите синтаксис SQL (особенно в отношении линейных терминаторов). Например, см. https://github.com /orcle/python-cx_orcle/blob/master/samples/sampleenv.py#l116 . Однако это означает вызов <код> execute() больше раз, который не так эффективно, как первое решение.

 

The execute() and executemany() functions only work on one SQL or PL/SQL statement.

You can wrap the three statements in a PL/SQL BEGIN/END block like:

SQL> begin   2  insert into test values(1);   3  update test set a = 2;   4  end;   5  /  PL/SQL procedure successfully completed. 

Alternatively you can split up your string into individual statements. If the statements originate from a file, you can write a wrapper to read file and execute each statement. This is a lot easier if you restrict the SQL syntax (particularly regarding line terminators). For an example, see https://github.com/oracle/python-cx_Oracle/blob/master/samples/SampleEnv.py#L116 However this means calling execute() more times, which isn't as efficient as the first solution.

</div
 
 

Связанный проблема

1  Установите внешние файлы в докерный контейнер  ( Mount external files into docker container ) 
У меня есть приложение прогнозирования со структурой ниже папки: <код> Docker ├── dataset │   └── fastText │   └── crawl-300d-2M.vec ├── Dockerfile ├── ...

0  Как пройти некоторые данные из Python3 на Java  ( How to pass some data from python3 to java ) 
Вот моя проблема: мне нужно создать бот раздорты, который использует распознавание речи для распознавания голосовых команд и отправлять распознанные строки в ...

1  Создайте сюжетный участок для каждого столбца в DF с циклом «для»  ( Create plotly plot for each column in df with a for loop ) 
Я хочу сделать несколько графиков сюжета (один для каждого столбца) в DF с использованием for Loop в Python. Я также хочу иметь возможность показать участки...

-4  Как суммировать значения при заворачивании аналогичного ключа, чтобы построить Dict  ( How to sum values when zipping similar key to build a dict ) 
У меня есть <код> A = [a, b, c, d, a, d, c] и <код> B=[1, 2, 3, 4, 5, 6, 7] Почему <код> dict(zip(A,B)) не возвращается <код> {'a': 6, 'b': 2, 'c': 10, '...

-1  Python Program бросает ошибку, потому что он говорит, что он не может найти Pygame, хотя я импортировал его в программу  ( Python program throws error because it says it cannot find pygame even though i ) 
<код> import sys import pygame def run_game(): pygame.init() screen=pygame.display.set_mode((1200,800)) pygame.display.set_caption("Space Battle...

5  Сайт к изображению  ( Website to image ) 
Я запускаю Python 3.1, и вы бы назвали меня продвинутым начинающим :) Мой вопрос простой: я пытаюсь сделать простую программу, которая просит пользователям ...

2  Ошибка установки Scipy с использованием PIP3  ( Error installing scipy using pip3 ) 
Я пытаюсь установить Scipy на OS X 10.8.5, используя PIP3 следующим образом: <код> pip3 install scipy Но я получаю следующие ошибки: <код> compile opt...

10  Сумма продуктов для нескольких списков в Python  ( Sum of products for multiple lists in python ) 
Попытка имитировать функцию Sumproduct Excel: <код> SUMPRODUCT(v1, v2, ..., vN) = v1[0]*v2[0]*...*vN[0] + v1[1]*v2[1]*...*vN[1] + ... + v1[n]*v2[n]*...*...

0  Всплывающий виджет не открывается в киве  ( Popup widget doesnt reopen in kivy ) 
При нажатии клавиши открывается всплывающее окно, нажав кнопку, она закрывается, но когда клавиша снова нажата, вызывая всплывающее окно дает ошибку Widg...

0  Pandas импорт не вставляет все строки  ( Pandas import not inserting all rows ) 
Я импортирую файл .csv с 3300 рядами данных через следующее: <код> kendo0 После успешного импорта я делаю запрос «Выбрать * из ...» на моем столе, которы...

2  Python призывает насмешку с "=" не называется результатом  ( Python calling mock with not called result ) 
Я пытаюсь издеваться на следующий звонок: <код> df_x = method() # returns a pandas dataframe df_x.loc[df_x['atr'] < 0, 'atr'] = 0 Я издевался на метод, ...

2  Арифметические операторы Python  ( Python arithmetic operators ) 
Есть ли какой-нибудь модуль или библиотека, где один получает список всех арифметических операторов в Python? Например: - от модуля строки мы можем получить...

1  Деконструкция базового Tk Inter Script  ( Deconstructing basic tk inter script ) 
Мне нужна помощь в понимании того, как TK Inter Works.i'm использую первый пример с страницы документов, которые создают простое окно с 2 кнопками. Введение ...

0  Корневой виджет Tkinter не будет инициализировать с Python 3.5  ( Tkinter root widget wont initialize with python 3 5 ) 
Я только что установил AnaConda и пытается запустить скрипт, который работал нормально до того, как только с помощью Python 2.7. Теперь я не могу инициализиро...

1  Как мне позвонить в родительский класс в подклассе?  ( How do i call on a parent class in a subclass ) 
Мне нужно создать вызов несвязанного метода, чтобы установить имя и листья, и я не знаю, как. Любая помощь ценится. Мой код: <код> class Plant(object): ...

Связанный проблема

1  Установите внешние файлы в докерный контейнер 
0  Как пройти некоторые данные из Python3 на Java 
1  Создайте сюжетный участок для каждого столбца в DF с циклом «для» 
-4  Как суммировать значения при заворачивании аналогичного ключа, чтобы построить Dict 
-1  Python Program бросает ошибку, потому что он говорит, что он не может найти Pygame, хотя я импортировал его в программу 
5  Сайт к изображению 
2  Ошибка установки Scipy с использованием PIP3 
10  Сумма продуктов для нескольких списков в Python 
0  Всплывающий виджет не открывается в киве 
0  Pandas импорт не вставляет все строки 
2  Python призывает насмешку с "=" не называется результатом 
2  Арифметические операторы Python 
1  Деконструкция базового Tk Inter Script 
0  Корневой виджет Tkinter не будет инициализировать с Python 3.5 
1  Как мне позвонить в родительский класс в подклассе?