oracle修改sql
『壹』 Oracle資料庫數據修改語句
把查出來的數據做一個表g,a.rsc_status_cd as rsc_status
使用update g set g.rsc_status = '43'。
使用b表數據更新a表,那麼where條件是什麼,也就是說,更新a表中哪些數據,用b表中的哪些數據更新,二者的關系是什麼。從你的語句中我看不出b表和a表的關聯。
找到關聯條件後,通過關聯條件查出的b表數據是否唯一,如果不唯一,還是會出現「返回值多於一行」的錯誤。
邏輯結構
它由至少一個表空間和資料庫模式對象組成。這里,模式是對象的集合,而模式對象是直接引用資料庫數據的邏輯結構。模式對象包括這樣一些結構:表、視圖、序列、存儲過程、同義詞、索引、簇和資料庫鏈等。邏輯存儲結構包括表空間、段和范圍,用於描述怎樣使用資料庫的物理空間。
總之,邏輯結構由邏輯存儲結構(表空間,段,范圍,塊)和邏輯數據結構(表、視圖、序列、存儲過程、同義詞、索引、簇和資料庫鏈等)組成,而其中的模式對象(邏輯數據結構)和關系形成了資料庫的關系設計。
以上內容參考:網路-Oracle資料庫
『貳』 oracle 修改觸發器里的sql文
--設定:--TA(name varchar2(12),num varchar2(10),ydsalary number(12,2))--TB(name varchar2(12),num varchar2(10),ydsalary number(12,2),ynsalary number(12,2))--TC(name varchar2(12),num varchar2(10),ybsalary number(12,2))--TA不可以是視圖--觸發器寫在TA上,為插入前觸發:CREATE OR REPLACE TRIGGER TR_IB_TABEFORE INSERTON TAREFERENCING NEW AS New OLD AS OldFOR EACH ROWDECLAREyd TB.ydsalary%TYPE;BEGINSELECT ydsalary INTO yd FROM TB WHERE name=:NEW.name AND num = :NEW.num AND rownum=1;IF :NEW.ydsalary != yd THEN--這里有可能是負數哦insert into TC(name,num,ybsalary) values(:NEW.name,:NEW.num,:NEW.ydsalary - yd);END IF;EXCEPTION WHEN OTHERS THEN RAISE;END TR_IB_TA;/
『叄』 oracle SQL語句怎麼修改數據表的欄位允許為空
欄位允許為空的語句為:altertable表名altercolumn列名類型長度null。
資料庫SQL語言的修改語句,可以用來修改基本表,其一般表示格式為:
ALTER TABLE<表名>[改變方式]
改變方式:
1、 加一個欄位: ADD "欄位 1" "欄位 1 資料種類"
2、刪去一個欄位: DROP "欄位 1"
3、改變欄位名稱: CHANGE "原本欄位名" "新欄位名" "新欄位名資料種類"
4、改變欄位的資料種類: MODIFY "欄位 1" "新資料種類"
(3)oracle修改sql擴展閱讀
如需在表中添加列,請使用下面的語法: ALTER TABLE table_name ADD column_name datatype
如需刪除表中的列,請使用下面的語法(請注意,某些資料庫系統不允許這種在資料庫表中刪除列的方式):ALTER TABLE table_name DROP COLUMN column_name
要改變表中列的數據類型,請使用下面的語法:
SQL Server / MS Access:ALTER TABLE table_name ALTER COLUMN column_name datatype
My SQL / Oracle:ALTER TABLE table_name MODIFY COLUMN column_name datatype
Oracle 10G 之後版本:ALTER TABLE table_name MODIFY column_name datatype;
『肆』 如何改變oracle sql語句執行計劃
一、通過PL/SQL Dev工具
1、直接File->New->Explain Plan Window,在窗口中執行sql可以查看計劃結果。其中,Cost表示cpu的消耗,單位為n%,Cardinality表示執行的行數,等價Rows。
2、先執行 EXPLAIN PLAN FOR select * from tableA where paraA=1,再 select * from table(DBMS_XPLAN.DISPLAY)便可以看到oracle的執行計劃了,看到的結果和1中的一樣,所以使用工具的時候推薦使用1方法。
注意:PL/SQL Dev工具的Command window中不支持set autotrance on的命令。還有使用工具方法查看計劃看到的信息不全,有些時候我們需要sqlplus的支持。
二、通過sqlplus
1.最簡單的辦法
Sql> set autotrace on
Sql> select * from al;
執行完語句後,會顯示explain plan 與 統計信息。
這個語句的優點就是它的缺點,這樣在用該方法查看執行時間較長的sql語句時,需要等待該語句執行成功後,才返回執行計劃,使優化的周期大大增長。如果不想執行語句而只是想得到執行計劃可以採用:
Sql> set autotrace traceonly
這樣,就只會列出執行計劃,而不會真正的執行語句,大大減少了優化時間。雖然也列出了統計信息,但是因為沒有執行語句,所以該統計信息沒有用處,如果執行該語句時遇到錯誤,解決方法為:
(1)在要分析的用戶下:
Sqlplus > @ ?
dbmsadminutlxplan.sql
(2) 用sys用戶登陸
Sqlplus > @ ?sqlplusadminplustrce.sql
Sqlplus > grant plustrace to user_name;
- - user_name是上面所說的分析用戶
2.用explain plan命令
(1) sqlplus > explain plan for select * from testdb.myuser
(2) sqlplus > select * from table(dbms_xplan.display);
上面這2種方法只能為在本會話中正在運行的語句產生執行計劃,即我們需要已經知道了哪條語句運行的效率很差,我們是有目的只對這條SQL語句去優化。其實,在很多情況下,我們只會聽一個客戶抱怨說現在系統運行很慢,而我們不知道是哪個SQL引起的。此時有許多現成的語句可以找出耗費資源比較多的語句,如:
SELECT ADDRESS, substr(SQL_TEXT,1,20) Text, buffer_gets, executions,
buffer_gets/executions AVG FROM v$sqlarea
WHERE executions>0 AND buffer_gets > 100000 ORDER BY 5;
ADDRESS TEXT BUFFER_GETS EXECUTIONS AVG
-------- ---------------------------------------- ----------- ---------- ------------------------------------------------------------
66D83D64 select t.name, (sel 421531 60104 7.01336017
66D9E8AC select t.schema, t.n 1141739 2732 417.913250
66B82BCC select s.synonym_nam 441261 6 73543.5
從而對找出的語句進行進一步優化。當然我們還可以為一個正在運行的會話中運行的所有SQL語句生成執行計劃,這需要對該會話進行跟蹤,產生trace文件,然後對該文件用tkprof程序格式化一下,這種得到執行計劃的方式很有用,因為它包含其它額外信息,如SQL語句執行的每個階段(如Parse、Execute、Fetch)分別耗費的各個資源情況(如CPU、DISK、elapsed等)。
3、啟用SQL_TRACE跟蹤所有後台進程活動:
全局參數設置: .OracleHome/admin/SID/pfile中指定: SQL_TRACE = true (10g)
當前session中設置:
SQL> alter session set SQL_TRACE=true;
SQL> select * from al;
SQL> alter session set SQL_TRACE=false;
對其他用戶進行跟蹤設置:
SQL> select sid,serial#,username from v$session where username='XXX';
SID SERIAL# USERNAME
------ ---------- ------------------
127 31923 A
128 54521 B
開啟跟蹤:SQL> exec dbms_system.set_SQL_TRACE_in_session(127,31923,true);
關閉跟蹤:SQL> exec dbms_system.set_SQL_TRACE_in_session(127,31923,false);
然後使用oracle自帶的tkprof命令行工具格式化跟蹤文件。
4、使用10046事件進行查詢:
10046事件級別:
Lv1 - 啟用標準的SQL_TRACE功能,等價於SQL_TRACE
Lv4 - Level 1 + 綁定值(bind values)
Lv8 - Level 1 + 等待事件跟蹤
Lv12 - Level 1 + Level 4 + Level 8
全局設定:
OracleHome/admin/SID/pfile中指定: EVENT="10046 trace name context forever,level 12"
當前session設定:
開啟:SQL> alter session set events '10046 trace name context forever, level 8';
關閉:SQL> alter session set events '10046 trace name context off';
對其他用戶進行設置:
SQL> select sid,serial#,username from v$session where username='XXX';
SID SERIAL# USERNAME
------ ---------- ------------------
127 31923 A
SQL> exec dbms_system.set_ev(127,31923,10046,8,'A');
5、使用tkprof格式化跟蹤文件: (根據下面SQL語句得到的文件都不存在該目錄下,郁悶啊,懵懂啊...)
一般,一次跟蹤可以分為以下幾步:
1、界定需要跟蹤的目標范圍,並使用適當的命令啟用所需跟蹤。
2、經過一段時間後,停止跟蹤。此時應該產生了一個跟蹤結果文件。
3、找到跟蹤文件,並對其進行格式化,然後閱讀或分析。
--使用一下SQL找到當前session的跟蹤文件:
SELECT d.value|| '/' ||lower(rtrim(i.instance, chr( 0 )))|| '_ora_' ||p.spid|| '.trc' trace_file_namefrom( select p.spid from v$mystat m,v$session s, v$process pwhere m.statistic# = 1 and s.sid = m.sid and p.addr = s.paddr) p,( select t.instance from v$thread t,v$parameter vwhere v.name = 'thread' and (v.value = 0 or t.thread# = to_number(v.value))) i,( select value from v$parameter where name = 'user_mp_dest' ) d;-- 其它用戶的 session SELECT d.value|| '/' ||lower(rtrim(i.instance, chr( 0 )))|| '_ora_' ||p.spid|| '.trc' trace_file_name from ( select p.spid from v$session s, v$process p where s.sid= '27' and s. SERIAL#= '30' and p.addr = s.paddr) p, ( select t.instance from v$thread t,v$parameter v where v.name = 'thread' and (v.value = 0 or t.thread# = to_number(v.value))) i, ( select value from v$parameter where name = 'user_mp_dest' ) d;
--查找後使用tkprof命令,將TRACE文件格式為到D盤的explain_format.txt文件中
SQL> $tkprof d:/oracle/admin/FZLGFM/ump/fzlgfm_ora_3468.trc d:/explain_format.txt
文件內容大致如下(看不太懂....懵懂啊.....天啊....神啊.....過幾時就懂了/////////////)
TKPROF: Release 9.2.0.1.0 - Proction on 星期二 4月 20 13:59:20 2010
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
Trace file: d:/oracle/admin/FZLGFM/ump/fzlgfm_ora_3468.trc
Sort options: default
********************************************************************************
count = number of times OCI procere was executed
cpu = cpu time in seconds executing
elapsed = elapsed time in seconds executing
disk = number of physical reads of buffers from disk
query = number of buffers gotten for consistent read
current = number of buffers gotten in current mode (usually for update)
rows = number of rows processed by the fetch or execute call********************************************************************************
alter session set events '10046 trace name context forever, level 8'
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 0 0.00 0.00 0 0 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 0 0.00 0.00 0 0 0 0
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 1 0.00 0.00 0 0 0 0
Misses in library cache ring parse: 0
Misses in library cache ring execute: 1
Optimizer goal: CHOOSE
Parsing user id: SYS
『伍』 oracle sql developer 能否直接修改sql查詢出的數據
你用sql查詢的數據
只是數據的展示
數據有可能是從多張表中查詢出來的數據
不建議在SQL
查詢中修改數據
建議用SQL中使用UPDATE語句修改資料庫中的數據
或者在參與查詢表中修改數據
如果無法實現可以將查詢結果導入新表中,在新表中那個修改數據
『陸』 oracle sql 語句修改表中數據怎麼寫
修改:update cmsuser set name=aaaa where id=1;添加:insert into cmsuser values(...);--需自己添加刪除:delete from cmsuser where id=1。
『柒』 oracle資料庫sql命令怎麼改
你說的比較范范,我只能讓你看看語句大全,你可以全面了解
Oracle資料庫語句大全
ORACLE支持五種類型的完整性約束
NOT NULL (非空)--防止NULL值進入指定的列,在單列基礎上定義,默認情況下,ORACLE允許在任何列中有NULL值.
CHECK (檢查)--檢查在約束中指定的條件是否得到了滿足.
UNIQUE (唯一)--保證在指定的列中沒有重復值.在該表中每一個值或者每一組值都將是唯一的.
PRIMARY KEY (主鍵)--用來唯一的標識出表的每一行,並且防止出現NULL值,一個表只能有一個主鍵約束.
POREIGN KEY (外部鍵)--通過使用公共列在表之間建立一種父子(parent-child)關系,在表上定義的外部鍵可以指向主鍵或者其他表的唯一鍵.ORACLE支持五種類型的完整性約束
NOT NULL (非空)--防止NULL值進入指定的列,在單列基礎上定義,默認情況下,ORACLE允許在任何列中有NULL值.
CHECK (檢查)--檢查在約束中指定的條件是否得到了滿足.
UNIQUE (唯一)--保證在指定的列中沒有重復值.在該表中每一個值或者每一組值都將是唯一的.
PRIMARY KEY (主鍵)--用來唯一的標識出表的每一行,並且防止出現NULL值,一個表只能有一個主鍵約束.
POREIGN KEY (外部鍵)--通過使用公共列在表之間建立一種父子(parent-child)關系,在表上定義的外部鍵可以指向主鍵或者其他表的唯一鍵.
1--設置每行顯示多少字元 set linesize 300;
2 設置每頁顯示多少條記錄 set pagesize 30;
3 用戶名的切換: 如 conn system/tiger
Conn sys/change_on_install as sysdba(注意超級用戶 在後面加as sysdba)
4 在超級用戶下查找普通用戶的表是查不到的 必須這樣查找 如 select * from scott.emp(普通用戶下的emp表)
5 查看當前是那個用戶身份登錄: show user;
6 查看有多少張表: select * from tab;(注意不同用戶下的表是不同的)
7查看錶的結構: desc emp(emp為表名)
8 取出重復的列(DISTINCT): 如 SELECT DISTINCT JOB EMP(去掉job的重復的值)
9字元串的鏈接操作用: ||
10 查詢有獎金的員工: select* from emp where comm is not null;
11 查詢沒有獎金的員工信息: select * from emp where comm is null;
12 兩個條件以上就得用and 如查詢工資大雨1500和有獎金的員工 select * from emp where sal>1500 and comm is not null;
13 表示兩個條件有一個滿足就可就用:or 如查詢工資大於1500或者沒有獎金的員工信息
Select * from emp where sal>1500 or comm is not null;
14取反可以用not 如 查詢員工工資不大於1500和有獎金的員工信息 如:
Select * from emp where not (sal>1500 or comm is not null);
15 在什麼什麼之間用between----and----如查詢工資在1500和3000之間的員工信息:
Select * from emp where sal between 1500 and 3000;
16 查詢員工編號是2323, 4555, 2222的員工具體信息: 如
Select * from emp where empno in(2323,4555,2222);
17.l模糊查詢 like 一般結合"%"和"_"使用其中%:表示可以匹配任意長度的內容,"_"表示匹配一個長度放入內容 如: 查詢員工姓名中第二哥字母是M的員工信息:
Select * from emp where ename LIKE '_M%';
又如姓名中包含M的員工 Select * from emp where ename LIKE '%M%';
18oracle中不等於有兩種表示方式"<>"和"!="
19 排序用order by {asc desc}其中asc 是升序排列 如果不寫就默認按升序排列desc是按降序排列 排序語句放在sal語句的最後如: 按員工工資進行排序
Select * from emp order by sal asc(升序)
Selecct * from emp order by sal desc(降序)
Select * from emp where deptno='10' order by sal desc,hiredate asc;(查詢部門10的員工工資的升序排列如果工資相等就按員工的入職時間排序)
20.group by 用於對查詢的結果進行分組統計: 顯示每個部門的平均工資和最高工資 如:
Select avg(sal),max(sal) from emp group by deptno;
Having 子句用於限制分組顯示結果: 顯示平均工資大於2000的的部門號和他的平均工資?
如:select avg(sal), deptno from emp group by deptno having avg(sal)>2000;
2. 單行函數:
1 小寫變大寫: upper 如 select * from emp where ename=upper('smith');
講一個字元串變為小寫字母表示 如: select lower('HELLO WORLD') FROM DUAL;
將單詞的首字母變大寫 用 INITCAP 如: SELECT INITCAP('HELLO WORLD') FROM DUAL;
2.字元串的操作
Substr()截取字元串 length()字元串的長度 replace()替換字元串
3數值函數
四捨五入: round();
截斷小數位:trunc();
『捌』 怎樣用sql語句修改oracle中表的數據
添加一個和原欄位同名的欄位
ALTER TABLE 表名 ADD 欄位名 VARCHAR2(30);
將原來的數據更新到新欄位中,這是要注意,一定要顯示進行數據類型轉換(不同於MSSQL)
UPDATE 表名 SET 欄位名 = CAST(欄位名1 AS VARCHAR2(30));
『玖』 oracle修改存儲過程名字sql
第一:表名稱作為傳遞參數,直接在儲存存儲過程中進行好像不行。
第二:列名稱也作為參數,使用動態SQL的時候怎麼得到返回的結果。
第二:使用動態SQL的時候,傳遞值不能直接放在StringInfo中直接使用EXECUTE IMMEDIATE StringInfo。這樣會報錯的,非常坑。需要使用<=:1 這樣的參數替換機制,然後使用 using xxxvalue1,xxxvalue2;
第四:批量刪除。