『壹』 請問各位oracle高手 存儲過程怎麼使用其他用戶的表呢本人新手。。。剛開始玩oracle,多多指點
樓主的存儲過程有誤,創建完存儲過程要用as然後聲明,聲明我記得應該給個初值把,我改了一下你的存儲過程如下,樓主試試可用嗎?
create or replace procere youc_pro01(youc_ename varchar2) as
v_sal number(10):=0;
begin
select e.sal into v_sal from scott.emp e where e.ename = youc_ename;
if v_sal < 3000 then
update scott.emp
set scott.emp.sal = scott.emp.sal*1.1
where scott.emp.ename = youc_ename;
end if;
end;
『貳』 怎麼在存儲過程里調用另一個伺服器中的資料庫的表
怎麼在存儲過程里調用另一個伺服器中的資料庫的表
首先需要知道「另一個存儲過程」的結果集的所有列的類型。
假設「另一個存儲過程」的名字是sp1,沒有參數,返回的結果集共3列,全部為int型,那麼「存儲過程」里添加一個與結果集列數相同的臨時表或表變數用於接收「另一個存儲過程」的結果集
『叄』 從存儲過程中調用另一個用戶下的存儲過程的話,怎麼調用呢,有許可權的情況下,我還需要聲明什麼嗎
你這個應該是不需要聲明的
不過比較好奇 你這個為什麼要在另一個存儲過程里調啊
一般是有出參的存儲過程,調的時候需要傳參,要新建一個存儲過程來調,這種的是需要聲明的
『肆』 sql 存儲過程調用異地資料庫 存儲過程或表
EXEC @s_procere1 @dt_bdate,@dt_edate,@dt_bindate,@dt_eindate,@s_line,@s_bus,@s_driver
這句應該是寫成動態SQL語句。
exec ( @s_procere1 + @dt_bdate + ', ' + @dt_edate + ',' + @dt_bindate + ',' @dt_eindate + ',' + @s_line + ',' + @s_bus + ',' + @s_driver )
因為,你取到得存儲過程名稱是一個字元串,所以要把這個串和相應的參數組成一個大串,然後用動態SQL執行的方法執行。
『伍』 Oracle 存儲過程:如何將查詢到的數據插入到另一個用戶名下的一張表中
看你的這兩個用戶是不是在同一個資料庫中,如果不是同一個資料庫,可以建立一個DBLINK來連接;如果是在同意個庫內可以這樣寫:
insert into A(column1,column2,column3)
select bbb.B.columns1,bbb.B.columns2,bbb.B.columns3 from bbb.B
where bbb.B.columns1=0;
『陸』 如何在存儲過程中調用其他用戶的存儲過程
過程前面加 模式 名稱就可以了啊
不過,你除了有該存儲過程的執行許可權外
還必須具有該存儲過程所涉及的對象的許可權
並且這些許可權不能通過角色獲得,包括dba角色
必須 直接的 grant 授權給該用戶
『柒』 怎麼實現存儲過程調用後與其他表進行關聯
這個不行的。存儲過程的結果不能和其他表格關聯了。
你這樣的情況,需要把存儲過程改寫成函數,然後再跟表格關聯。
函數的調用和其他表格的關聯可以保存為存儲過程。
『捌』 oracle中怎麼用存儲過程的的方法 把一個用戶里的一個表移到另一個用戶里
一樓的回答不一定是提問者要的吧. 第一帖試著回答,不知掉網路問答好玩不好玩..
有幾種方法可以做,一種是1樓回答的,建user,授權,然後imp/exp
針對於對你的問題的理解這是我的方法:
假設想從user A 移表C到user B.
此處樓主沒有說清楚,是同一個instance里的倆個不同user,還是倆個不同instance里的不同user.
如果不同instance里的不同user,以下方法里用了db link的方法
1. 倆個user存在, 並且有相關許可權,比如create session etc, 因為你有需要從一個user中去訪問另個user,所以Grant select,insert等你需要的許可權給另外個user,比如在user B里執行:
grant insert on C to A;
2. 在user B中建DB link使其能訪問user A;
3. user B 中建立和user A你想移的那種表的表結構定義,此處倆個選擇:
1). 手動建表,和moreazy做法一樣, 在user B里執行create table C as select * from userA where rownum<1;
2). 把建表語句build in到你的存儲過程中
4. 因為存儲過程里用到了dblink所以動態sql可能會被用到.
以上是思路,以下是偽代碼是最簡單的類型,不考慮性能等等,至少簡單邏輯,沒時間測,順手一寫:
簡單寫的沒有游標等等,如果考慮到大數據量,最好不要做一次性的insert select,用游標取出表數據然後loop的處理,適量的commit(比如1000-5000 commit)可大幅提高性能。
set serveroutput on;
DECLARE
v_dblink varchar2(128):='sss.com';
v_sql VARCHAR2(4000);
v_count NUMBER(10);
v_message VARCHAR2(4000);
BEGIN
-- check dblink
v_sql := 'select count(*) from all_db_links where db_link=upper('''||v_dblink||''')';
EXECUTE IMMEDIATE v_sql INTO v_count;
IF v_count = 0 THEN
v_message := 'db link '''||v_dblink||''' does not exist.';
DBMS_OUTPUT.PUT_LINE(v_message);
ELSE
v_sql := 'INSERT INTO C
(col1,col2)
SELECT col1,col2 FROM C'||v_dblink;
BEGIN
EXECUTE IMMEDIATE v_sql;
COMMIT;
EXCEPTION WHEN OTHERS THEN
v_message := SQLERRM(SQLCODE);
DBMS_OUTPUT.PUT_LINE(v_message);
END;
END IF;
END;
/
『玖』 oracle一個用戶訪問其他用戶下的數據表和存儲過程問題
查看a_user有多少存儲過程,需要有管理員許可權;可以讓DBA查一下,告知你;
調用a_user的存儲過程,首先要擁有存儲過程的執行(exec)許可權,如果想調試存儲過程還得另外開debug許可權;
調用方法call
a_user.存儲過程名或call
a_user.包名.存儲過程名
『拾』 SQL SERVER裡面如何在存儲過程裡面獲取另一個存儲過程所返回的表的數據
首先需要知道「另一個存儲過程」的結果集的所有列的類型。
假設「另一個存儲過程」的名字是sp1,沒有參數,返回的結果集共3列,全部為int型,那麼「存儲過程」里添加一個與結果集列數相同的臨時表或表變數用於接收「另一個存儲過程」的結果集
如下
CREATE PROCEDURE sp2
AS
DECLARE @t table(a int,b int,c int)
INSERT INTO @t(a,b,c)
EXEC sp1
SELECT * FROM @t
使用SQLSERVER存儲過程可以很大的提高程序運行速度,簡化編程維護難度,現已得到廣泛應用。
創建存儲過程
和數據表一樣,在使用之前需要創建存儲過程,它的簡明語法是:
引用:
Create PROC 存儲過程名稱
[參數列表(多個以「,」分隔)]
AS
SQL 語句
例:
引用:
Create PROC upGetUserName
@intUserId INT,
@ostrUserName NVARCHAR(20) OUTPUT -- 要輸出的參數
AS
BEGIN
-- 將uName的值賦給 @ostrUserName 變數,即要輸出的參數
Select @ostrUserName=uName FROM uUser Where uId=@intUserId
END
其中 Create PROC 語句(完整語句為Create PROCEDURE)的意思就是告訴SQL SERVER,現在需要建立一個存儲過程,upGetUserName 就是存儲過程名稱,@intUserId 和 @ostrUserName 分別是該存儲過程的兩個參數,注意,在SQL SERVER中,所有用戶定義的變數都以「@」開頭,OUTPUT關鍵字表示這個參數是用來輸出的,AS之後就是存儲過程內容了。只要將以上代碼在「查詢分析器」里執行一次,SQL SERVER就會在當前資料庫中創建一個名為「upGetUserName」的存儲過程。你可以打開「企業管理器」,選擇當前操作的資料庫,然後在左邊的樹型列表中選擇「存儲過程」,此時就可以在右邊的列表中看到你剛剛創建的存儲過程了(如果沒有,刷新一下即可)。
二、存儲過程的調用
之前已經創建了一個名為「upGetUserName」的存儲過程,從字面理解該存儲過程的功能是用來取得某一個用戶的名稱。存儲過程建立好了,接下來就是要在應用程序里調用了,下面看一下在ASP程序里的調用。
引用:
Dim adoComm
』// 創建一個對象,我們用來調用存儲過程
Set adoComm = CreateObject("ADODB.Command")
With adoComm
』// 設置連接,設 adoConn 為已經連接的 ADODB.Connection 對象
.ActiveConnection = adoConn
』// 類型為存儲過程,adCmdStoredProc = 4
.CommandType = 4
』// 存儲過程名稱
.CommandText = "upGetUserName"
』// 設置用戶編號
.Parameters.Item("@intUserId").Value = 1
』// 執行存儲過程
.Execute
』// 取得從存儲過程返回的用戶名稱
Response.Write "用戶名:" & .Parameters.Item("@ostrUserName").Value
End With
』// 釋放對象
Set adoComm = Nothing
通過以上兩步,已經可以創建和使用簡單的存儲過程了。下面來看一個稍微復雜點的存儲過程,以進一步了解存儲過程的應用。
三、存儲過程的實際應用
用戶登錄在ASP項目中經常會使用到,但使用存儲過程來做驗證可能不多,那麼做例子,寫一個簡單的用戶登錄驗證的存儲過程。
引用:
Create PROC upUserLogin
@strLoginName NVARCHAR(20),
@strLoginPwd NVARCHAR(20),
@blnReturn BIT OUTPUT
AS
-- 定義一個臨時用來保存密碼的變數
DECLARE @strPwd NVARCHAR(20)
BEGIN
-- 從表中查詢當前用戶的密碼,賦值給 @strPwd 變數,下面要對他進行比較
Select @strPwd=uLoginPwd FROM uUser Where uLoginName=@strLoginName
IF @strLoginPwd = @strPwd
BEGIN
SET @blnReturn = 1
-- 更新用戶最後登錄時間
Update uUser SET uLastLogin=GETDATE() Where uLoginName=@strLoginName
END
ELSE
SET @blnReturn = 0
END
用戶登錄的存儲過程建立好了。注意,在一個區域內如果有多條語句時,必需使用BEGIN...END關鍵字。
引用:
Dim adoComm
』// 創建一個對象,我們用來調用存儲過程
Set adoComm = CreateObject("ADODB.Command")
With adoComm
』// 設置連接,設 adoConn 為已經連接的 ADODB.Connection 對象
.ActiveConnection = adoConn
』// 類型為存儲過程,adCmdStoredProc = 4
.CommandType = 4
』// 存儲過程名稱
.CommandText = "upUserLogin"
』// 設置登錄名稱
.Parameters.Item("@strLoginName").Value = "***"
』// 設置登錄密碼
.Parameters.Item("@strLoginPwd").Value = "123456"
』// 執行存儲過程
.Execute
』// 判斷是否登錄成功
If .Parameters.Item("@blnReturn").Value = 1 Then
Response.Write "恭喜你,登錄成功!"
Else
Response.Write "不是吧,好像錯了哦。。。"
End If
End With
』// 釋放對象
Set adoComm = Nothing
通過以上的步驟,簡單用戶登錄驗證過程也做完了,現在只要把它整合到程序中就可以實現簡單的用戶登錄驗證了,關於其他細節就由你自己來處理了。
上面介紹的兩個存儲過程都是只返回一個值的,下面我們來看一個返回一個記錄集的存儲過程。
引用:
Create PROC upGetUserInfos
@intUserGroup INT
AS
BEGIN
-- 從資料庫中抽取符合條件的數據
Select uName,uGroup,uLastLogin FROM uUser Where uGroup=@intUserGroup
-- 插入一列合計
UNION
Select 』合計人數:』,COUNT(uGroup),NULL FROM uUser Where uGroup=@intUserGroup
END
現在我們來看一下ASP程序的調用。
引用:
Dim adoComm
Dim adoRt
』// 創建一個對象,我們用來調用存儲過程
Set adoComm = CreateObject("ADODB.Command")
Set adoRs = CreateObject("ADODB.Recordset")
With adoComm
』// 設置連接,設 adoConn 為已經連接的 ADODB.Connection 對象
.ActiveConnection = adoConn
』// 類型為存儲過程,adCmdStoredProc = 4
.CommandType = 4
』// 存儲過程名稱
.CommandText = "upGetUserInfos"
』// 設置用戶組
.Parameters.Item("@intUserGroup").Value = 1
』// 執行存儲過程,和以上幾個例子不同,這里使用RecordSet的Open方法
adoRs.Open adoComm
』// 顯示第一個值
Response.write adoRs.Fields(0).Value
End With
』// 釋放對象
Set adoRs = Nothing
Set adoComm = Nothing