我可以理解,很多年前会有这种限制,但现在肯定可以很容易地增加这个限制.我们有对象的命名约定,但总会有一个案例出现在我们达到这个限制的地方 - 特别是在命名外键时.
有人真的知道为什么这不是一个更大的尺寸 - 或者它是否在11g更大?
显然答案是它会破坏当前没有防御编码的脚本.我说这是一个非常令人担忧的事情,甲骨文正在试图成为该数据库,想必这是什么样的,你必须不断提高的东西,否则你的产品会死一千削减死亡.
每当我在内部看到这种反对意见时,我认为是时候咬紧牙关并将其解决了.如果人们正在运行在升级Oracle版本时不检查或维护的脚本,那么让他们承受该选择的后果.为他们提供一个兼容性标志,大小达到4000,然后节省我浪费的时间,当我创建必须经常数到30的对象来检查名称是否'OK'.
我想检查SID和当前数据库名称.
我正在使用以下查询来检查oracle SID
select instance from v$thread;
Run Code Online (Sandbox Code Playgroud)
但表或视图不存在错误即将到来.
我正在使用以下查询来检查当前数据库名称
select name from v$database;
Run Code Online (Sandbox Code Playgroud)
但表或视图不存在错误即将到来.
对上述两个问题有什么想法吗?
我是否正确理解CREATE OR REPLACE基本上意味着"如果对象存在,丢弃它,然后以任何方式创建它?"
如果是这样,我做错了什么?这有效:
CREATE TABLE foo (id NUMBER,
title VARCHAR2(4000) DEFAULT 'Default Title')
Run Code Online (Sandbox Code Playgroud)
这不是(ORA-00922:缺失或无效选项):
CREATE OR REPLACE TABLE foo (id NUMBER,
title VARCHAR2(4000) DEFAULT 'Default Title')
Run Code Online (Sandbox Code Playgroud)
我做了些蠢事吗?我似乎无法找到有关此语法的大量文档.
我正在使用Hibernate 3.5.6和Oracle 10g.我在初始化期间看到了以下异常,但应用程序本身工作正常.这个例外的原因是什么?以及如何纠正?
异常
在createClob()
方法抛出错误时禁用上下文LOB创建:java.lang.reflect.InvocationTargetException
信息
Oracle版本:Oracle数据库10g企业版10.2.0.4.0版JDBC驱动程序:Oracle JDBC驱动程序,版本:11.1.0.7.0
执行以下代码时,它只是说过程已完成,并且不打印我想要的信息(firstName,lastName),然后是下表中select查询的其他值.
CREATE OR REPLACE PROCEDURE PRINT_ACTOR_QUOTES (id_actor char)
AS
CURSOR quote_recs IS
SELECT a.firstName,a.lastName, m.title, m.year, r.roleName ,q.quotechar from quote q, role r,
rolequote rq, actor a, movie m
where
rq.quoteID = q.quoteID
AND
rq.roleID = r.roleID
AND
r.actorID = a.actorID
AND
r.movieID = m.movieID
AND
a.actorID = id_actor;
BEGIN
FOR row IN quote_recs LOOP
DBMS_OUTPUT.PUT_LINE('a.firstName' || 'a.lastName');
end loop;
END PRINT_ACTOR_QUOTES;
/
Run Code Online (Sandbox Code Playgroud)
当设置服务器输出时,我得到
a.firstNamea.lastName
a.firstNamea.lastName
a.firstNamea.lastName
a.firstNamea.lastName
Run Code Online (Sandbox Code Playgroud)
多次!
可能重复:
为什么Oracle 9i将空字符串视为NULL?
我在Oracle 10g中的表命名TEMP_TABLE
,只有两列- id
和description
只为示范的缘故.
该列id
是序列生成的类型主键,NUMBER(35, 0) not null
列DESCRIPTION
是其类型VARCHAR2(4000) not null
.
在这种情况下,基本的表结构如下所示.
+--------------+-----------+---------------+
|Name | Null? | Type |
+--------------+-----------+---------------+
|ID | NOT NULL | NUMBER(35) |
|DESCRIPTION | NOT NULL | VARCHAR2(4000)|
+--------------+-----------+---------------+
Run Code Online (Sandbox Code Playgroud)
创建此表后,我尝试INSERT
交替插入以下命令.
INSERT INTO temp_table (id, description) VALUES (1, null); ->unsuccessful
INSERT INTO temp_table (id, description) VALUES (2, ''); ->unsuccessful
Run Code Online (Sandbox Code Playgroud)
它们都不成功,因为not null
在DESCRIPTION
列上强制执行约束.
在这两种情况下,Oracle都抱怨道
ORA-01400: cannot insert NULL …
Run Code Online (Sandbox Code Playgroud) 我使用的是Linux,Oracle10g.我创建了一个名为test的用户.并授予create session并为同一用户选择任何字典权限.
我还向同一用户授予了sysdba和sysoper角色.
现在我想显示授予用户的所有权限和角色.我发现以下查询,但它只显示创建会话和选择字典权限.
select privilege
from dba_sys_privs
where grantee='SAMPLE'
order by 1;
Run Code Online (Sandbox Code Playgroud)
请帮忙解决问题.
谢谢
我想编写一个SELECT语句,它只使用一个测试来返回没有值的列(null,empty或所有空格).
我认为这会奏效:
SELECT column_name from table_name WHERE column_name NOT LIKE '%_%';
Run Code Online (Sandbox Code Playgroud)
但这对NULL值不起作用.
我当然可以补充一下
OR column_name IS NULL
Run Code Online (Sandbox Code Playgroud)
它会起作用,但我想要一种使用单一测试的方法.
我有1列的表,并有以下数据
Status
a1
i
t
a2
a3
Run Code Online (Sandbox Code Playgroud)
我想在我的选择查询中显示以下结果
Status| STATUSTEXT
a1 | Active
i | Inactive
t | Terminated
a2 | Active
a3 | Active
Run Code Online (Sandbox Code Playgroud)
我能想到的一种方法是在select查询中使用Switch When表达式
SELECT
status,
CASE status
WHEN 'a1' THEN 'Active'
WHEN 'a2' THEN 'Active'
WHEN 'a3' THEN 'Active'
WHEN 'i' THEN 'Inactive'
WHEN 't' THEN 'Terminated'
END AS StatusText
FROM stage.tst
Run Code Online (Sandbox Code Playgroud)
有没有其他方法可以做到这一点,我不需要写入当表达3次活动状态,并且可以在一个表达式中检查整个活动状态?