‘壹’ 请问各位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