标签: varchar2

是不是有切换Oracles空varchar2 - null行为?

正如每个使用Oracle的人都知道的那样,当放入Varchar2列时,空的Varchar2将导致NULL值.

我(以及同事)也认为我们已经阅读过可以在数据库中设置的参数,以更改该行为并实际区分空值和空字符串.

新版本中是否有这样的参数?(我们认为自10g)

或者是否有一个我们可能会混淆的参数?

string null oracle10g varchar2

4
推荐指数
1
解决办法
255
查看次数

当我尝试将列从VARCHAR2(200)修改为VARCHAR2(1000)时,为什么会出现"ORA-01429:索引组织表"?

它目前是VARCHAR2(200)数据库中的一个,但它需要被提升到VARCHAR(1000),所以我试图运行这个脚本:

ALTER TABLE CONTRACTOR MODIFY
(
    NOTE VARCHAR2(1000)
);
Run Code Online (Sandbox Code Playgroud)

Oracle给了我这个:

ORA-01429:索引组织表:没有用于存储溢出行块的数据段

这是一个10g的数据库.有什么想法吗?我可以创建一个重复的列,复制数据,然后删除旧列,但我想知道在我这样做之前这个错误是什么.

oracle alter-table varchar2

4
推荐指数
1
解决办法
8381
查看次数

实体框架和Oracle:无法插入VARCHAR2> 1,999个字符

我在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)

string oracle entity-framework varchar2 ora-00932

4
推荐指数
1
解决办法
4319
查看次数

将VARCHAR2与CHAR进行比较的最佳方法

我在寻找最好的,最快的方式来比较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)

oracle comparison char varchar2

4
推荐指数
1
解决办法
4482
查看次数

为什么 CAST 截断文本而不是抛出错误?

将文本转换为比值短长度会导致文本被截断。

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 那样抛出错误?

oracle casting truncate varchar2 oracle18c

4
推荐指数
1
解决办法
175
查看次数

用VARCHAR2替换CHAR

我怎么能代替CHARVARCHAR2模式中的所有表中?

注意:我满足于返回ALTER TABLE语句的查询,因此我可以保存脚本并再次运行它.

oracle replace char varchar2

3
推荐指数
1
解决办法
3068
查看次数

pl/sql过程为varchar2列返回3个问号('???')(wls 10.3.4 - weblogic 11g)

我得到以下代码在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 …

java plsql varchar2 weblogic11g

3
推荐指数
1
解决办法
2497
查看次数

将listagg函数限制为前4000个字符

我有一个查询,使用该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个字符限制的问题,但不限制结果值.

sql oracle string-concatenation varchar2 oracle11g

3
推荐指数
1
解决办法
3万
查看次数

PL/SQL编译错误 - PLS-00382:表达式类型错误

我正在运行下面的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 …

oracle varchar types plsql varchar2

3
推荐指数
1
解决办法
2685
查看次数

ORACLE 中的 VARCHAR2 数据类型

我对 Oracle 很陌生,今天我发现了数据类型VARCHAR2,我想了解更多关于它的信息,并用谷歌搜索我遇到问题的数据类型。

我浏览了几篇有关该数据类型的文章,并且发现了一些针对VARCHAR2 的直接相反的描述。

描述1:

  • 创建包含 VARCHAR2 列的表时,您可以为 VARCHAR2 列指定 1 到 2000 之间的最大列长度(以字节为单位,而不是字符)(文章

描述2:

  • VARCHAR2 列中最多可以存储 4000 个字符。(文章

正如你所看到的,这有点令人困惑。难道VARCHAR2是指定最大列长度还是最大字符长度?有人请解释一下哪一个是正确的吗?

oracle varchar2

3
推荐指数
1
解决办法
4805
查看次数