在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

发表留言:

« Previous | Main | Next »

英语900句 | English 900

  • Who will accompany you to the airport?
  • 谁将陪你去机场?
  • Why don't you agree?
  • 你为什么不同意?
  • Why not go out for a walk?
  • 干吗不出去散步?
  • How did you doing spend your holiday?
  • 你假期怎么过的?
  • How are you doing these days?
  • 这些日子你怎么样?