Переменная подстановки, похоже, не работает в запросе для описания таблицы оракула

Я пытаюсь описать таблицу без использования команды DESCRIBE, но хочу объединить запрос с переменная подстановки. Предполагая, что у меня есть следующая таблица:

--DROP TABLE customers       CASCADE CONSTRAINTS PURGE;
CREATE TABLE customers
( customer_id number(10) NOT NULL,
  customer_name varchar2(50) NOT NULL,
  city varchar2(50)
);

Следуя сообщениям здесь и здесь, но добавляя переменную подстановки, я последующий:

ACCEPT myv CHAR PROMPT 'Enter a table name: '

SELECT 
    column_name AS "Name", 
    nullable AS "Null?",
    concat(concat(concat(data_type,'('),data_length),')') AS "Type"
FROM user_tab_columns
WHERE table_name = '&myv';

Это возвращает пустую таблицу с соответствующими именами столбцов. Неважно, ввел ли я имя таблицы в строке ввода как CUSTOMERS или customers. Однако desc customers дает:

Name          Null     Type         
------------- -------- ------------ 
CUSTOMER_ID   NOT NULL NUMBER(10)   
CUSTOMER_NAME NOT NULL VARCHAR2(50) 
CITY                   VARCHAR2(50) 

Любая идея, как я могу заставить переменную подстановки работать здесь? Спасибо.


person sedeh    schedule 23.05.2015    source источник
comment
Я спрашиваю о скрытом предположении, просто чтобы быть уверенным - действительно ли вы запускаете этот код в Oracle SQL * Plus? Или может в другом клиенте?   -  person krokodilko    schedule 23.05.2015
comment
Я запустил его в разработчике sql.   -  person sedeh    schedule 23.05.2015
comment
Я протестировал этот запрос на моем разработчике Sql, я использую версию 4.1.0.19, он работал нормально. Вы можете использовать функцию UPPER в условии WHERE, чтобы изменить регистр символов: WHERE table_name = UPPER('&myv');. Вы также можете добавить: SELECT UPPER('&myv') FROM DUAL; в целях отладки, чтобы проверить правильность введенного имени таблицы или нет.   -  person krokodilko    schedule 23.05.2015
comment
Хм, я в тупике. Использование UPPER ничего не меняет. Я использую версию 4.0.3.16. Под добавлением вы подразумеваете что-то вроде: ACCEPT myv CHAR PROMPT 'Enter a table name: ' SELECT UPPER('&myv') FROM DUAL;.   -  person sedeh    schedule 23.05.2015


Ответы (1)


Я заставил его работать с переменной привязки . Не совсем уверен, что происходит, потому что @kordirko сказал, что запрос работает для него как есть. Во всяком случае, чтобы заставить его работать на меня (я использую SQL Developer версии 4.0.3.16), я использовал переменную связывания, например:

SELECT 
    column_name "Name", 
    nullable "Null?",
    concat(concat(concat(data_type,'('),data_length),')') AS "Type"
FROM user_tab_columns
WHERE table_name = :myv;

Затем я ввел CUSTOMERS в поле значения окна Enter Binds, и запрос был выполнен нормально. Если кто-нибудь знает, почему переменная подстановки не удалась, а переменная привязки не удалась, это, безусловно, добавит обсуждения.

person sedeh    schedule 23.05.2015