正如每个使用Oracle的人都知道的那样,当放入Varchar2列时,空的Varchar2将导致NULL值.
我(以及同事)也认为我们已经阅读过可以在数据库中设置的参数,以更改该行为并实际区分空值和空字符串.
新版本中是否有这样的参数?(我们认为自10g)
或者是否有一个我们可能会混淆的参数?
它目前是VARCHAR2(200)数据库中的一个,但它需要被提升到VARCHAR(1000),所以我试图运行这个脚本:
ALTER TABLE CONTRACTOR MODIFY
(
NOTE VARCHAR2(1000)
);
Run Code Online (Sandbox Code Playgroud)
Oracle给了我这个:
ORA-01429:索引组织表:没有用于存储溢出行块的数据段
这是一个10g的数据库.有什么想法吗?我可以创建一个重复的列,复制数据,然后删除旧列,但我想知道在我这样做之前这个错误是什么.
我在Oracle表中创建了一个4,000个字符的VARCHAR2字段.我使用Visual Studio 2010,.NET Framework 4和ODAC 11.2第4版的 LINQ to Entities以及Visual Studio的Oracle Developer Tools(11.2.0.3.0)将字符串值插入到字段中.当我尝试插入大于1,999个字符的字符串值时,我得到以下内部异常:
Oracle.DataAccess.Client.OracleException
ORA-00932:不一致的数据类型:预期 - 得到NCLOB
但是,我可以使用SQL Developer在字段中插入4,000个字符的字符串值而不会出现任何问题.
有一个已知的ODAC错误(源#2),其中保存到XMLTYPE字段时有2,000个字符限制,但我没有保存到XMLTYPE字段.我在我的GAC中有Oracle.DataAccess 2.112.3.0,我考虑更新到上述Oracle软件的第5版(11.2.0.3.20),但是"Oracle Developer Tools for Visual Studio"是唯一一个似乎是从第4版更新,我相信"Oracle Data Provider for .NET 4"是需要更新的组件.在我的.NET项目中,System.Data.Entity和System.Data.OracleClient都是运行时版本4.0.30319.
无论如何,我只是想知道是否有其他人遇到过这个错误,如果有的话,如果找到了任何解决方案 - 除了上面链接的Oracle论坛帖子中的那个提议使用存储过程作为解决方法.谷歌告诉我,只有在使用XMLTYPE字段时,人们才会遇到此错误,但我不能成为唯一一个在使用VARCHAR2字段时遇到此错误的人,可以吗?
(FWIW,我也希望在上面链接的Oracle论坛帖子中收到用户"997340"的帖子回复.如果我收到有用的回复,我一定会在这方面分享知识.)
编辑:如果有帮助,下面是我的代码中失败的两个块.我在对第一个进行故障排除时创建了第二个块,只是为了查看是否存在任何差异.检查字符串值是否已插入("if"语句)时,以及实际插入字符串值("AddObject"语句)时,我得到异常.
1:
if (!(from q in db.MSG_LOG_MESSAGE where q.MESSAGE == msg select q.MESSAGE).Any())
{
db.MSG_LOG_MESSAGE.AddObject(new MSG_LOG_MESSAGE { MESSAGE = msg });
db.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
2:
if (!db.MSG_LOG_MESSAGE.Any(q => q.MESSAGE == msg))
{
db.MSG_LOG_MESSAGE.AddObject(new MSG_LOG_MESSAGE { MESSAGE = msg }); …Run Code Online (Sandbox Code Playgroud) 我在寻找最好的,最快的方式来比较VARCHAR2(50 BYTE)同CHAR(12 BYTE).
有两个数据库,第一个包含带有CHAR列的table1(下划线表示填充CHAR长度的空格字符)
ID VALUE
1 123-45___
2 123-456__
3 123-457__
Run Code Online (Sandbox Code Playgroud)
第二个数据库(table2)包含没有空格的VARCHAR2.
ID VALUE
4 123-45
5 123-456
6 123-457
Run Code Online (Sandbox Code Playgroud)
所以,我想要这样的东西
SELECT table1.ID FROM table1 WHERE table1.VALUE = '123-45'
Run Code Online (Sandbox Code Playgroud) 将文本转换为比值短的长度会导致文本被截断。
select
cast('ROAD-1234' as varchar2(8)) as id
from
dual
ID
--------
ROAD-123
--^ Notice that the number 4 has been removed
Run Code Online (Sandbox Code Playgroud)
我原以为这CAST AS VARCHAR2会表现得与CAST AS NUMBER.
select
cast(1234 as number(3)) as id
from
dual
Error: ORA-01438: value larger than specified precision allowed for this column
Run Code Online (Sandbox Code Playgroud)
为什么CAST AS VARCHAR2 会默默地截断文本而不是像 CAST AS NUMBER 那样抛出错误?
我怎么能代替CHAR与VARCHAR2模式中的所有表中?
注意:我满足于返回ALTER TABLE语句的查询,因此我可以保存脚本并再次运行它.
我得到以下代码在OAS10上正常工作,从sql过程中获取自定义对象数组:
Connection conn = null;
OracleCallableStatement stmt = null;
RequestsWrapper requestsWrapper = null;
conn = getConnection(DATASOURCE);
if (conn != null) {
stmt = (OracleCallableStatement) conn.prepareCall("{call packageName.procedureName(?, ?, ?)}");
stmt.registerOutParameter(3, OracleTypes.ARRAY, "V_ARRAY_OF_CUSTOM_OBJECTS");
stmt.setString(1, in1);
stmt.setString(2, in2);
stmt.execute();
ARRAY zahtjev = (ARRAY) cs.getArray(3);
RequestsWrapper requestsWrapper = new RequestsWrapper();
for (Object object : (Object[]) zahtjev.getArray()) {
if (object != null) {
CustomObject co = new CustomObject();
Object[] attributes = ((STRUCT) object).getAttributes();
co.setVarcharAttribute((String) attributes[0]);
co.setNumericAttribute(((BigDecimal) attributes[1]).intValue());
requestsWrapper.getObjectList().add(co);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我必须将应用程序迁移到WLS 10.3.4.当我尝试执行现有代码时,我遇到了一个异常:无法转换为oracle.sql.ARRAY.我在WLS文档中找到了:
对于Oracle Thin驱动程序中的大多数扩展,您可以使用标准技术,如使用JDBC扩展到JDBC接口中所述.但是,Oracle …
我有一个查询,使用该listagg函数将所有行作为逗号分隔的字符串,最终发送到一个大文本框.我收到以下异常:
ORA-01489: result of string concatenation is too long
我知道问题是正在运行以聚合数据的查询返回了很多行,listagg正在执行的字符串连接违反了4000 char限制.但是,对于我的用例,截断前4000个字符是完全可以接受的.
如何从此处修改此示例查询以将"值"列限制为最多4000个字符?
SELECT LISTAGG(product_name, ', ') WITHIN
GROUP(
ORDER BY product_name DESC) "Product_Listing"
FROM products
你无法substr绕过调用listagg' becauselistagg throws the exception beforesubstr`被调用.
我已经看到很多关于如何绕过4000个字符限制的问题,但不限制结果值.
我正在运行下面的PL/SQL ...
DECLARE
BEGIN
FOR i IN (select VALUE from REWARDS)
LOOP
insert into BT_CMS.T_REWARDS_TYPES
(ID, REWARD_LABEL, REWARD_VALUE, REWARD_METHOD, UPDATE_USER, UPDATE_DATE, PAYMENT_PROVIDER_ID, CREATE_DATE, COUNTRY_CODE_ID)
values
(BT_CMS.SEQ_REWARD_TYPE_ID.nextval, 'R' || i || ' Real Time', i, 'Airtime', 'DEVOPS-826', sysdate, 120, sysdate, 206);
END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)
......并在下面得到错误......
ORA-06550: line 8, column 72:
PLS-00382: expression is of wrong type
ORA-06550: line 8, column 52:
PLS-00382: expression is of wrong type
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
Run Code Online (Sandbox Code Playgroud)
我很确定问题是我被替换为值,但我不知道究竟是什么问题.正在选择i的REWARDS表中的VALUE列具有data_type …