我试图ALTER通过添加一个新CLOB列(在Oracle 10)的表,但它的失败.给我一个ORA-01735错误.问题是我无法通过谷歌搜索找到我的查询特别错的东西所以我想我会问这里以防万一.
无论如何我的查询是:
ALTER TABLE "MYSCHEMA"."MYTABLE" ADD "ACOLUMN" CLOB(2048);
Run Code Online (Sandbox Code Playgroud)
并得到以下错误:
SQL Error: ORA-01735: invalid ALTER TABLE option
01735. 00000 - "invalid ALTER TABLE option"
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
谢谢.
Oracle有一个CLOB类型和功能EMPTY_CLOB().
我正在寻找在SQL服务器中使用的替代方案.
提前致谢.
我有一个表 feature_vector_t 有两列 doc_id 和 feature_vector,其中 feature_vector 是一个CLOB包含字符串的。
由于同一个 doc_id 可能有多个 feature_vector 值,我试图使用以下方法进行计数:
select doc_id, count(feature_vector) from feature_vector_t group by doc_id
Run Code Online (Sandbox Code Playgroud)
但是,我收到一个错误说
ORA--00932 不一致的数据类型:预期得到 CLOB 00932。00000-“不一致的数据类型:预期 %s 得到 %s”
另一个查询通过将 Clob 转换为字符串来工作
select doc_id, count(dbms_lob.substr(feature_vector, 1, 5)) from feature_vector_t group by doc_id
Run Code Online (Sandbox Code Playgroud)
有人能解释一下幕后发生了什么吗?为什么不使用原始clob计数?
我已经存储了plsql程序,它从文件中获取大文本
create or replace
procedure dbst_load_a_file( p_file_name in varchar2, l_clob out clob )
as
l_bfile bfile;
dst_offset number := 1 ;
src_offset number := 1 ;
lang_ctx number := DBMS_LOB.DEFAULT_LANG_CTX;
warning number;
begin
l_bfile := bfilename( 'SCHEMES_OF_PS', p_file_name );
dbms_lob.fileopen( l_bfile );
dbms_lob.loadclobfromfile(
DEST_LOB => l_clob
, SRC_BFILE => l_bfile
, AMOUNT => dbms_lob.getlength( l_bfile )
, DEST_OFFSET => dst_offset
, SRC_OFFSET => src_offset
, BFILE_CSID => DBMS_LOB.DEFAULT_CSID
, LANG_CONTEXT => lang_ctx
, WARNING => warning);
dbms_lob.fileclose( l_bfile );
end; …Run Code Online (Sandbox Code Playgroud) 我正在尝试向 Oracle 表添加一列,并检查我正在添加的 CLOB 类型列的 JSON。
ALTER TABLE TAB1 (ADD COL_NEW CLOB CONSTRAINT CONS1 (CLOB IS JSON));
ALTER TABLE TAB1 ADD COL_NEW CLOB CONSTRAINT CONS1 (CLOB IS JSON) ;
ALTER TABLE TAB1 ADD COL_NEW CLOB CONSTRAINT CONS1 (CLOB IS JSON);
Run Code Online (Sandbox Code Playgroud)
以上所有都失败并出现错误:
ERROR execute() failed with: ORA-02253: constraint specification not allowed here
ERROR execute() failed with: ORA-01735: invalid ALTER TABLE option
Run Code Online (Sandbox Code Playgroud) 我在使用Hibernate 3和ojdbc7.jar的Tomcat 7上的应用程序中有一个非常奇怪的错误:在当前版本中,DB列已更改为CLOB,并按以下方式配置:
@Column(name = "BESCHREIBUNG")
@Length(min = 0, max = 4000)
@NotNull
@Lob
public String getBeschreibung() {
Run Code Online (Sandbox Code Playgroud)
这在我的本地环境(Oracle 11g XE)和测试环境(Oracle 12)中完全正常,但是在prelive环境(Oracle 12)中,我在应用程序启动期间收到以下错误:
org.hibernate.HibernateException: Wrong column type in XXXX.MYTABLE for column BESCHREIBUNG. Found: clob, expected: varchar2(4000 char)
at org.hibernate.mapping.Table.validateColumns(Table.java:283)
at org.hibernate.cfg.Configuration.validateSchema(Configuration.java:1343) at org.hibernate.tool.hbm2ddl.SchemaValidator.validate(SchemaValidator.java:139)
at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:378)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1872)
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:906)
Run Code Online (Sandbox Code Playgroud)
有什么暗示吗?我已经检查过tomcat的/ lib - 目录,如果有一个过时的ojdbc或hibernate jar,没有成功.
如果您需要存储大部分(如果不是全部)小于 4K 字节的字符串,那么在 VARCHAR2 数据类型上使用 CLOB 数据类型是否有任何负面影响?
从这里
CLOB 可以存储在单独的 LOB 段中,指向 LOB 段的指针与表的其余数据一起存储在数据块中。如果使用 CREATE TABLE 语句,您可以使用 LOB 存储子句控制 LOB 段的存储位置。默认情况下,小于 4000 字节的 LOB 将以与 VARCHAR2 相同的方式存储,即与其余数据内联。
从这里:
当您创建一个带有 CLOB 列的表时,CLOB 有一个名为“启用行中存储”的选项。这决定了 CLOB 是存储在与表相同的段中,因此与表行的其余部分一起存储,还是单独存储在单独的段中。在第二种情况下,表格行将包含一个指向 CLOB 数据位置的指针。一般将CLOB与表行一起存储效率更高,但是如果CLOB超过4000个字符左右,就不能再存储在行中,不管是否启用行中存储,都存储在CLOB段中或不。
从这些语句中,在我看来,即使所有行都包含少于 4K 行,但将列声明为 CLOB 并没有任何惩罚。这是准确的吗?
我有一个带有 CLOB 字段的查询,我想以 UTF8 格式返回她的值。例如,如果字段是 varchar,则下一个查询可以正常工作,但如果是 CLOB,则不会返回正确的 UTF8 字符串。
select convert(field, 'AL32UTF8', 'WE8ISO8859P15') from table;
Run Code Online (Sandbox Code Playgroud)
如何从查询中的 CLOB 返回 UTF8 字符串?
我将clob数据插入mysql数据库......这是我的代码
Clob cl=dbCon.createClob();
cl.setString(1,userAbout);
dbCon.setAutoCommit(false);
PreparedStatement insertClob=dbCon.prepareStatement("UPDATE user_data SET user_about=? WHERE user_id=?");
insertClob.setClob(1,cl);
insertClob.setInt(2,userId);
int count= insertClob.executeUpdate();
if(count==1){dbCon.commit();dbCon.close();out.write("success");}
else{dbCon.rollback();dbCon.close();out.print("error");}
Run Code Online (Sandbox Code Playgroud)
这是一个例外
java.lang.AbstractMethodError: org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.createClob()Ljava/sql/Clob;
Run Code Online (Sandbox Code Playgroud)
这是什么问题?我该如何解决?
我的问题很重要。
我应该执行运行INSERT INTO查询的PL / SQL脚本。看起来像:
DECLARE
newId NUMBER(38,0) := &1;
BEGIN
Insert into FOO ("ID", "DESCRIPTION")
values (newId+1, 'LARGE CLOB WHICH PRODUCES EXCEPTION');
-- A LOT OF INSERT QUERIES
END;
/
exit;
Run Code Online (Sandbox Code Playgroud)
因此,我发现将CLOB分配给VARCHAR2变量是一个好主意,因为它可能是32767字节长。我的目标是针对每个INSERT INTO查询执行此操作。喜欢:
--assign CLOB to VARCHAR2 variable
-- INSERT variable instead of CLOB type
Run Code Online (Sandbox Code Playgroud)
我想指出的是,我INSERT INTO在脚本中有很多查询,因此我应该在每个INSERT INTO查询之前重新分配变量,我该怎么做?