I have not used oracle before and I was to modify the clob data as it has my home phone number. But when I do select * from
table shows CLOB
and I cannot see the data. How can I see the data and how to I Update?
I need the query.
在PL/SQL Developer
中,选择ROWID
表格列:
SELECT t.*, t.rowid
FROM mytable t
这将允许您编辑表格的数据。
然后只需检查...
该字段附近的按钮CLOB
并进行编辑。
您可以从文件中加载它,也可以只在编辑字段中输入。
您使用什么工具来执行查询?sqlplus 会将 clob 列中的选择截断为参数 long 的值。如果您使用的是 sqlplus,则将 long 设置为足够大的值以容纳 clob,然后执行简单的选择应该返回数据。Clob 只是文本,因此可以像表中的任何其他列一样查询它。如果您使用的是 sqlplus 并且它不返回任何内容而不是部分返回,请确保已填充表中的列。
在代码中?
Java(更新作为 dbo 对象中的字段保存的 CLOB 字段):
String sql = "SELECT clobby_wobby FROM table WHERE uuid = ? FOR UPDATE";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setLong(1, dbo.getUID());
ResultSet rs = ps.executeQuery();
if (rs.next()) {
oracle.sql.CLOB clob = (oracle.sql.CLOB) ((OracleResultSet) rs).getClob(1);
failed = writeClob(clob, dbo.getClobbyWobby());
}
rs.close();
ps.close();
其中 writeClob() 是:
protected boolean writeClob(oracle.sql.CLOB clob, String data) throws SQLException {
if (data == null) { return false; }
return writeClob(clob, data.toCharArray());
}
protected boolean writeClob(oracle.sql.CLOB clob, char[] data) throws SQLException {
if (data == null || clob == null) { return false; }
char[] buffer = new char[clob.getBufferSize()];
Writer os = clob.getCharacterOutputStream();
int len = -1;
CharArrayReader car = new CharArrayReader(data);
try {
while ((len = car.read(buffer)) != -1) {
os.write(buffer, 0, len);
os.flush();
}
} catch (IOException ioe) {
logger.error("IOException copying clob data into DB", ioe);
return false;
} finally {
try {
car.close();
os.close();
} catch (IOException ioe) {}
}
return true;
}
有时我想知道为什么该死的 Oracle 驱动程序本身无法检测到一个字段是一个 CLOB 并且只是透明地处理 ps.setString("very long value"); 本身......这就是有人回答说“为什么不使用 Oracle LOB Java 实用程序方法?!”的地方 我从来不知道...
在 SQL 开发人员中,“打开”表。选择“数据”选项卡(这将检索所有数据)。然后在过滤器栏(顶部)中,提供您的条件以获取要更新的单行。更新所需的列,然后提交更改。
我正在使用 dbVisualizer 并且我进行了定期更新并且它有效。感谢 MichaelN 告知 Clob 只是文本,因此可以像表中的任何其他列一样查询它。这帮助我在几分钟内解决了我的问题。
您使用的是旧版本的 sqlplus 吗?
如果您使用的是 sql developer,只需使网格的列更宽。
我为您介绍我的方法:这是 pl/sql 中的一个示例。您可以创建一个从 clob 读取的过程。
Declare
Variableclob Clob;
Temp_Save Varchar2(32767);
index_pass number;
Begin
For I In (select id_reporte from reporte where id_reporte between 201 and 218)
Loop
Index_Pass:=To_Number(I.Id_Reporte);
Select Consulta Into Temp_Save From Reporte Where Id_Reporte=Index_Pass;
Variableclob:=To_Clob(Temp_Save);
Dbms_Output.Put_Line(Variableclob);
End Loop ;
End;
Remember to use:
set serveroutput on;
begin DBMS_OUTPUT.ENABLE(9999999999999); end;