Можно ли объединить значение переменной в текст приглашения ACCEPT? - PullRequest
0 голосов
/ 20 июня 2019

Я пытаюсь добавить значение переменной в поле приглашения принять в oracle developer

ACCEPT  confirm  char  PROMPT 'Are you sure you want to delete org_name ?  ' ||org_name ;    
SET SERVEROUTPUT ON
SET VERIFY OFF
VARIABLE org_name VARCHAR2(100);
VARIABLE STATUS VARCHAR2(100);
ACCEPT p_orgid CHAR PROMPT 'Enter organization ID: ';

Это мой код:

    DECLARE
        orgname     VARCHAR(200);  
    BEGIN
        SELECT
            name
        INTO
            :org_name
        FROM
            table
        WHERE
            o_id = '&p_orgid';
        IF
            SQL%found
        THEN
            dbms_output.put_line('Are you sure you want to delete ( '
            || :org_name
            || ' ) ? ');
            :STATUS :=  :org_name || ' has been deleted';  
        END IF;   
    EXCEPTION
        WHEN no_data_found THEN
            dbms_output.put_line('No Data Found ');     
    END;
    /


ACCEPT  confirm  char  PROMPT 'Are you sure you want to delete org_name ?  ' ||org_name ;    

Возвращенное имя org_name должно отображаться в окне приглашения, приглашение Accept, похоже, не принимает значения переменных.

Ответы [ 2 ]

0 голосов
/ 21 июня 2019

Вы также можете использовать NEW_VALUE для перевода :org_name (переменная связывания) в &nv (переменная подстановки), как показано ниже.Переменные подстановки распознаются в строках ACCEPT.

Ссылка

.
.
EXCEPTION
    WHEN no_data_found THEN
        dbms_output.put_line('No Data Found ');     
END;
/

COLUMN mybvcol NEW_VALUE nv NOPRINT
SELECT :org_name mybvcol FROM dual;

ACCEPT confirm  char  PROMPT 'Are you sure you want to delete org_name "&nv"?';
0 голосов
/ 20 июня 2019

Я могу показать вам, как это сделать в SQL * Plus. Посмотрите, сможете ли вы заставить его работать в SQL Developer.

Для целей тестирования я создал тестовую таблицу в схеме Скотта как

SQL> create table test as select * from dept;

Table created.

Сценарий выглядит следующим образом (я назвал его "cont" как продолжить выполнение сценария, если ... ):

select * from test;

prompt Which deptno do you want to delete?
accept p_deptno prompt 'Deptno : ';

set verify off;
set heading off;

select 'Are you sure you want to delete ' || d.dname || '? '
from test d
where d.deptno = &p_deptno;

accept odg prompt 'Y / N : ' ;

set termout off;
set pause off;
set echo off;
column a newline;
spool c:\temp\odg.sql

select decode(upper('&odg'), 'Y', 'prompt Executing ...',
                                  'prompt Stopped'
              ),
       decode(upper('&odg'), 'Y', '', 'accept return_key prompt ''Press <Return>''') a,
       decode(upper('&odg'), 'Y', '', 'exit') a
from dual;

spool off;
set termout on;

@c:\temp\odg       

delete from test where deptno = &p_deptno;

select * from test;

accept return_key prompt 'Press <Return>'
exit;

Посмотрим, как это работает:

SQL> @cont

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

Which deptno do you want to delete?
Deptno : 20

Are you sure you want to delete RESEARCH?

Y / N : y
Executing ...

1 row deleted.


        10 ACCOUNTING     NEW YORK
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

Press <Return>
Disconnected from Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production

c:\Temp>

В SQL Developer вы запускаете его как

c:\temp\cont.sql 

(вы бы написали это на рабочем листе) и выполняли его как скрипт. SQL Developer предложит вам параметры; смотреть выполнение в окне вывода скрипта.

...