【问题标题】:Substitution variable seems to fail in a query to describe an oracle table替换变量似乎在描述 oracle 表的查询中失败
【发布时间】:2015-08-05 04:34:02
【问题描述】:

我试图在不使用DESCRIBE 命令的情况下描述一个表,但我想将查询与substitution variable 结合起来。假设我有下表:

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

按照herehere 的帖子,但添加了一个替换变量,我有以下内容:

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) 

知道如何让替换变量在这里工作吗?谢谢。

【问题讨论】:

  • 我问一下隐藏的假设,只是为了确定——你真的在 Oracle SQL*Plus 中运行这个代码 sinppet 吗?或者也许在另一个客户中?
  • 我在sql developer中运行过。
  • 我已经在我的 Sql Developer 上测试了这个查询,我使用的是 4.1.0.19 版本,它运行良好。您可以在 WHERE 条件中使用UPPER 函数来更改字符的大小写:WHERE table_name = UPPER('&myv');。您还可以附加:SELECT UPPER('&myv') FROM DUAL; 进行调试,以检查输入的表名是否正确。
  • 嗯,我被难住了。使用UPPER 似乎并没有改变任何东西。我正在使用版本 4.0.3.16。 “追加”是指执行以下操作:ACCEPT myv CHAR PROMPT 'Enter a table name: ' SELECT UPPER('&myv') FROM DUAL;

标签: oracle oracle11g substitution data-dictionary


【解决方案1】:

我让它与bind variable 一起工作。不完全确定发生了什么,因为@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 窗口的值字段中,查询执行得很好。如果有人知道为什么替换变量失败但绑定变量没有,那肯定会增加讨论。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多