首页 | 摘要显示 | 上一页 1 2 3 4 下一页

AnySQL Archives

November 15, 2006

AnySQL中的特色功能介绍(八) -- 更新LONG/LOB列

    常看到有人问如何更新LOB或LONG类型的字段中的内容, 在SQL*Plus中是不容易的, 在AnySQL小工具中, 除了可以用LOB类型的主机变量, 我设计了LOB和LOBIMP命令来对这些数据类型进行查询操作, 这些命令可以将运行AnySQL的机器(非服务器端)上的文件上传更新到LONG/LOB字段中.

    LOB命令语法, 这里面query应当只返回一行及一列(LONG或LOB类型), 在SELECT中应当加上"FOR UPDATE"子句表示锁定LOB进行更新.

Usage:
  LOB query << file
Note :
  << mean import a file to blob/clob field, the query
     should include the for update clause

    LOBIMP命令语法, 这里面query应当只返回两列, 第一列为文件名, 第二列为LONG或LOB字段, 在SELECT中应当加上"FOR UPDATE"子句表示锁定LOB进行更新.

Usage:
  LOBIMP query
Note :
  Query should return tow column as following:
  col1 : CHAR or VARCHAR specify the filename.
  col2 : blob/clob field.

    下面来看一下例子中用到的表:

阅读全文

December 12, 2006

如何将BLOB的内容转到LONG RAW中

    PL/SQL基本上对于LONG RAW和BLOB无能为力, 对于这两种需要自已写程序来实现. 在AnySQL中就可以将BLOB的内容转换成LONG RAW, 下面是一个例子. 先来建一张测试表:

ASQL> SET QUERYONLY FALSE
ASQL> CREATE TABLE T_BLOB (ID NUMBER NOT NULL, IMAGE BLOB);

Create Table Succeed.

ASQL> VAR P_IMAGE BLOB
ASQL> DEFINE P_IMAGE=ASQL.EXE
ASQL> INSERT INTO T_BLOB VALUES (1, :P_IMAGE);

1 rows affected.

ASQL> DEFINE P_IMAGE=ASQLW.EXE
ASQL> INSERT INTO T_BLOB VALUES (2, :P_IMAGE);

1 rows affected.

ASQL> commit;

Commit Succeed.

    用LOBEXP命令将BLOB中的内容导出成一个个操作系统文件:

ASQL> LOBEXP SELECT 'IMAGE_'||ID||'.EXE', IMAGE FROM T_BLOB;

Write to file: IMAGE_2.EXE , bytes=101376
Write to file: IMAGE_1.EXE , bytes=101376
Command succeed.

    将表数据导出, 相应的BLOB字段替换为导出的操作系统文件名:

阅读全文

January 2, 2007

在AnySQL中如何增加自定义SQL命令?

    AnySQL的ORA命令中收集了我认为常用的一些SQL, 不过他们都是写死在程序中的, 因此要增加一个SQL时需要重新编译程序, 这样会比较麻烦, 今天做了一些改进, 以便可以增加自定义命令, 这个方法是通过增加了一个"scripts"目录, 然后将需要的SQL保存到.sql文件放入那个目录就可以了.

    那么如何调用自定义的SQL呢? 我们来看一下ora命令的格式:

ORA keyword [V1] [V2] [Vn]
其中:
      keyword为自定义功能的名称, 如果这个关键字没有被我收录, 则调用scripts目录下找keyword.sql(小写)文件.
      V1, V2, Vn为传入自定义SQL的参数, 总为字符类型

    需要说明的是在SQL中可以引用变量名(:变量名), 如"SELECT * FROM TAB WHERE TNAME LIKE = :V1". 在数据库中我们经常会用"owner.tablename"的形式, 因此每一个变量都又分解成两个子变量(:Vn_OWNER和:Vn_NAME), 分别表示用户名和对象名, 也就是每一个关键字后面的单词都有三个变量可以引用, 例如:

SELECT :V1, :V1_OWNER, :V1_NAME, :V2, :V2_OWNER,:V2_NAME FROM DUAL

    我们将这个SQL语句存成test.sql并放到scripts目录下, 然后就可以调用了:

ASQL> ora test a.b c.d

:1  :2 :3 :4  :5 :6
--- -- -- --- -- --
a.b a  b  c.d c  d

1 rows returned.

    在ora命令中所有的SQL语句都是可以用绑定变量的, 让我们来看一下真实的SQL, 是我用来显示某个表的统计信息的.

SELECT /* AnySQL */
   OWNER,NULL PARTNAME, INITIAL_EXTENT/1024 INIEXT,
   NEXT_EXTENT/1024 NXTEXT, NUM_ROWS NROWS, BLOCKS,
   AVG_SPACE AVGSPC,CHAIN_CNT CCNT, AVG_ROW_LEN ROWLEN,
   SAMPLE_SIZE SSIZE,LAST_ANALYZED ANADATE
FROM ALL_TABLES
WHERE UPPER(OWNER)=NVL(UPPER(:V1_OWNER),OWNER)
  AND TABLE_NAME=UPPER(:V1_NAME)
UNION ALL
SELECT /* AnySQL */
   TABLE_OWNER OWNER,PARTITION_NAME PARTNAME,
   INITIAL_EXTENT/1024 INIEXT,   NEXT_EXTENT/1024 NXTEXT,
   NUM_ROWS NROWS, BLOCKS, AVG_SPACE AVGSPC, CHAIN_CNT CCNT,
   AVG_ROW_LEN ROWLEN, SAMPLE_SIZE SSIZE,LAST_ANALYZED ANADATE
FROM ALL_TAB_PARTITIONS
WHERE UPPER(TABLE_OWNER)=NVL(UPPER(:V1_OWNER),TABLE_OWNER)
  AND TABLE_NAME=UPPER(:V1_NAME)

    运行结果如下:

OWNER  PARTNAME INIEXT NXTEXT NROWS BLOCKS AVGSPC CCNT ROWLEN SSIZE ANADATE  
------ -------- ------ ------ ----- ------ ------ ---- ------ ----- ----------
SYSTEM              64            1      1      0    0     11     1 2006-04-17

February 2, 2007

AnySQL中的特色功能介绍(九) -- ORA OBJSQL

    Oracle 9i以后多了个视图V$SQL_PLAN, 这个视图可以用于显示当前正在使用的SQL的执行计划, 其中有两列OBJECT_OWNER和OBJECT_NAME, 指的是执行计划中会访问到的对象, 包括表及索引等. 这个视图是很有用的, 除了看正在使用的执行计划外, 还可以用来看那些SQL在访问某个表或索引, 在你将要删除一个认为不重要的索引以前, 不防先看一下有没有SQL在用这个索引, 然后去看一下这个SQL的执行情况. "ORA OBJSQL"这个自定义命令就是为这个用途设计的.

    下面是一个使用的例子:

ASQL> ora objsql anysql.t_HASH

0 rows returned.

ASQL> SELECT COUNT(*) FROM ANYSQL.T_HASH;

COUNT(*)
--------
    7485

1 rows returned.

ASQL> ora objsql anysql.t_HASH

0 rows returned.

    为什么这个取记录数的SQL没有显示出来呢, 是因为这个表上面有一个唯一索引, 刚好索引的列是定义为非空的, 所以这个SQL去走索引了, 我们将"ORA OBJSQL"中的对象名换为索引的名字试试.

ASQL> ora objsql anysql.IDX_T_HASH

HASH_VALUE VERS SORTS EXECS READS GETS ROWCNT
---------- ---- ----- ----- ----- ---- ------
606471602    0     0     1    39  199      1

1 rows returned.

ASQL> ORA HASH 606471602

SELECT COUNT(*) FROM ANYSQL.T_HASH

    要写这出个后面的SQL其实很简单, 不需要我在这儿贴出来了.

February 26, 2007

在AnySQL中如何找出锁的拥有者?

    在比较忙的系统中我常用一段处理Resource Busy的角本来对表作DDL操作, 但还是常遇到久久不成成功的情况, 这时就要去看是那个会话一直锁住了我要修改的表, 我常用AnySQL中的两个命令来完成这个功能. 如下所示:

ASQL> list object t_long

TYPE      ID OWNER  OBJECT_NAME CREATED    MODIFIED   STATUS
----- ------ ------ ----------- ---------- ---------- ------
TABLE 538638 ANYSQL T_LONG      2006/08/02 2007/01/25 VALID

1 rows returned.

ASQL> ora hold 538638

SID SERIAL# SPID USERNAME MACHINE STATUS   PROGRAM
--- ------- ---- -------- ------- -------- ----------------
529   62199 44   ANYSQL   frisket INACTIVE sqlplus@frisket

1 rows returned.

    在找出会话之后, 就可以进一步分析, 是否可以将这个会话杀掉. 事实上这一招我们是常用的.

上一页 1 2 3 4 下一页

当前分类: AnySQL

Creative Commons License
本站版权: 共用创作 CC
署名-非商业性-相同方式分享
本站基于MT-3.36免费版
(©)版权所有, 2004 - 2008, www.AnySQL.net, 保留所有权利.
MSN: loufangxin(a)msn.com, Mail: anysql(at)126.com/support(at)iamdba.com, Skype ID:anysql