A. v$sql,v$sqlarea,v$sqltext有什麼區別
1、存儲的位置不同
V$SQL和V$SQLAREA存儲的SQL都是位於SHARED SQL AREA中的SQL,而V$SQLTEXT是位於SGA中的SQL。
2、存儲SQL的方式不同
V$SQL和V$SQLAREA都是用一行來存儲SQL全文,而V$SQLTEXT用一行存儲SQL的一行。
3、GROUP BY方式不同
V$SQL不存儲包含GROUP BY 的SQL語句。通常這個視圖,在每個查詢執行完成後更新,但對於執行很久的SQL,它是每5秒更新一次。
4、存儲的明細不同
V$SQL存儲的是具體的SQL和執行計劃相關信息。
V$SQLAREA存儲SQL語句的前1000個bytes和一些相關的統計信息,比如累計的執行次數,邏輯讀,物理讀等統計信息。Oracle10.2 中會多出sql_fulltext欄位,
是一個CLOB欄位。實際上,V$SQLAREA可以看作V$SQL根據SQLTEXT等做了GROUP BY之後的信息。
V$SQLTEXT中沒有統計信息,卻存儲著完整的SQL語言及其哈希ID等信息。
參考資料
Oracle官方文檔-V$SQL
Oracle官方文檔-V$SQLAREA
Oracle官方文檔-V$SQLTEXT
B. SQL中怎麼將字元串轉
在SQL SERVER 2005中,將表中字元串轉換為數字的函數共2個:
1. convert(int,欄位名) 例如:select convert(int,'3')
2. cast(欄位名 as int) 例如:select cast('3' as int)
其實,一般情況下沒有必要把字元串轉換為數字類型
假如需要比較兩個欄位是否相等,但是一個欄位為字元串類型,一個為數字類型,用「=」比較兩個值是否相等時,SQL SERVER會自動把字元串轉換為數字再比較的!
例如:
select da.TITLE_NAME,dsc.NAME
from dbo.DV_DUTY dd
inner join DV_SECOND_CLASS dsc on (dsc.ID=dd.AREA)
left join DV_ASSET da on(da.ID=dd.RECORD_ID and dd.TYPE='2')
where dd.AREA is not null
這個SQl中,inner join DV_SECOND_CLASS dsc on (dsc.ID=dd.AREA) 中dsc.ID為數字類型,dd.AREA為字元類型,相當於這樣on(1='1')的判斷,這時候就會自動吧字元串的'1'轉換為數字類型再比較的。
但是也有弊端,一旦字元類型轉換為數字類型出錯(說明字元串的確就非數字組成的),SQL就會拋出異常。
SQL SERVER 2005中有判斷欄位是否為數字的函數:
ISNUMERIC(欄位名) -----假如欄位是數字類型返回1,不是就返回0
但是好像有的時候不好使,比如:select isnumeric('3,34') 就返回1
說明這個函數對欄位值中全是數字但是數字間用「,」和「.」(逗號或點)隔開的都視為數字了!
C. 資料庫問題:嵌入式sql語句與主語言之間的通信機制是怎樣的
首先用SQL通信區(SQL
Communication
Area,簡稱SQLCA)向主語言傳遞SQL語句的執行狀態信息,使主語言能夠據此控製程序流程;在程序運行中,主語言向SQL語句提供參數,使用主變數(host
variable)輸入數據;同時,程序把SQL語句查詢資料庫的結果交主語言進一步處理,其中使用主變數和游標(cursor)向主語言輸出數據,從而實現了SQL語言的過程化工作。
SQL語句執行後,系統要反饋給應用程序若干信息,主要包括描述系統當前工作狀態和運行環境的各種數據,這些信息將送到SQL通信區SQLCA中。應用程序從SQLCA中取出這些狀態信息,據此決定接下來執行的語句。
D. SQL查詢分析器中,如何在同一表體里,復制不同類型的數值
update ptype set unit =
(select cast (area as numeric) from ptype ) a where ptype .area=a.area
首先要保證你area裡面的值都可以轉換為數值類型,要不然會報錯。
cast (area as numeric) 很久沒用sql server 了 我記得轉換格式應該是這樣 要是這個錯的話 你在網上查一下cast()這個函數的資料.
E. sql查詢報ora_02063,ora_01722
area_eid 欄位有不能轉化成數字的數據,所以報錯了。
因為數字優先順序高,所以在運算前,area_id要轉成數字。