Выполнение sql в процедуре с объединенной командной строкой

У меня вот это:

create procedure test_ins(IN tab varchar(128))
Language sql
begin
   DECLARE stmt_ins STATEMENT;
   DECLARE v_query varchar(2048);
   DECLARE test varchar(20);
   DECLARE test_tab varchar(20);
   set test = 'HERE IT IS';
   set test_tab = tab;
   set v_query= 'INSERT INTO '||test_tab||'(test, free) values (test,'''')';
   PREPARE stmt_ins from v_query;
   EXECUTE stmt_ins;

end@

Проблема в том, что кажется, что он запускается (нет сообщения об ошибке), но в таблице ничего нет ....

Любые идеи? Спасибо

Можете ли вы попробовать: установить v_query = 'INSERT INTO' || test_tab || '(test, free) values ​​(' || test || ',' '' ')';

Eray Balkanli 15.11.2018 16:24

Или, если мой комментарий выше не работает: установите v_query = 'INSERT INTO' || test_tab || '(test, free) values ​​(' 'test' ',' '' ')';

Eray Balkanli 15.11.2018 16:25

оба не работают

Viking 15.11.2018 16:34

ну, по крайней мере, мы устранили потенциальную проблему в будущем. Вы также можете попробовать "EXEC SQL EXECUTE stmt_ins" в конце?

Eray Balkanli 15.11.2018 16:42

Также попробуйте: EXEC SQL EXECUTE IMMEDIATE: stmt_ins;

Eray Balkanli 15.11.2018 16:43

О, нашел, мы забываем одинарные кавычки, должно быть как «Вот оно», то есть «» '|| test ||' ''. Обновил мой ответ, проверьте это.

Eray Balkanli 15.11.2018 17:00
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
6
34
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Кажется, вы не используете отладчик ... попробуйте тот, который есть в IBM Data Studio (бесплатный скачать).

create or replace procedure test_ins(IN tab varchar(128))
Language sql
specific test_ins
begin
    DECLARE v_query varchar(2048);
    DECLARE test varchar(20);
    DECLARE test_tab varchar(20);
    DECLARE stmt_ins STATEMENT;
    set test = 'HERE IT IS';
    set test_tab = tab;
    set v_query= 'INSERT INTO '||test_tab||'(test, free) values (''test'','''')';
    call dbms_output.put_line(v_query);
    PREPARE stmt_ins from v_query;
    EXECUTE stmt_ins;

end@

Отладчик не запускается (идентификатор пользователя не имеет прав) (я администратор на машине), однако он не работает. в журнале ничего нет и ошибок нет

Viking 15.11.2018 16:33

Отладчик отлично работает для меня как локального администратора, поэтому у вас другая проблема, не связанная с вашим вопросом. Точный код, который я показываю в своем ответе, работает правильно. Ваш код может отличаться. Если приведенный выше точный код не дает ни вставки, ни ошибки, значит, вы опускаете некоторую информацию.

mao 15.11.2018 16:37

Когда я просто выполняю оператор напрямую, он работает с подготовкой, а выполнить его не

Viking 15.11.2018 16:39

Работает ли точный код, показанный в моем ответе, в вашей среде? Вам не поможет, если вы измените вопрос внутри комментария!

mao 15.11.2018 16:41

Нет, к сожалению

Viking 15.11.2018 16:42

Тогда вы упускаете важную информацию. Поскольку вы, кажется, изучаете sprocs, вам нужен либо отладчик, либо либеральное использование dbms_output.put_line для показывать того, что на самом деле выполняется.

mao 15.11.2018 16:44

печальная вещь, dbms_output не отображается в командной строке или в студии данных, он работает напрямую, поэтому я должен работать с этим, я думаю

Viking 15.11.2018 16:45

Для работы из командной строки (db2cmd) требуется, чтобы dbms_output был запущен в командной строке db2 set serveroutput on перед вызовом sproc.

mao 15.11.2018 16:48

Наконец-то получил ... это '' '|| тест ||' '', '' ''

Viking 15.11.2018 16:55
Ответ принят как подходящий

Я думаю, вам нужно изменить test на '|| test ||' в наборе v_query, как показано ниже:

create procedure test_ins(IN tab varchar(128))
Language sql
begin
   DECLARE stmt_ins STATEMENT;
   DECLARE v_query varchar(2048);
   DECLARE test varchar(20);
   DECLARE test_tab varchar(20);
   set test = 'HERE IT IS';
   set test_tab = tab;
   set v_query= 'INSERT INTO '||test_tab||'(test, free) values ( '''||test||''','''')';
   PREPARE stmt_ins from v_query;
   EXECUTE stmt_ins; 

end@

Другие вопросы по теме