以下是cpp代码#include<iostream>
#include<stdio.h>
using namespace std;
int g();
int f(int& );
int a;
int g() {
a=2;
return f(a);
}
int f(int& x) {
a=a+1;
cout<<"f(int& x) a:"<<a<<endl;
x=x+2;
cout<<"f(int& x) x:"<<x<<endl;
cout<<"f(int& x) a*x:"<<a*x<<endl;
return a*x;
}
int main() {
cout<<"g():"<<g()<<endl;
getchar();
}
运行结果是:
f(int& x) a:3
f(int& x) x:5
f(int& x) a*x:25
g():25
因为传的是引用,相当于 a 和 x 指向的是同一个变量,最后a*x当然也就是 a的平方,可以理解。于是 我想把它翻译成oralce的程序包,我的思路是 用in out 传参模式表示传引用,于是有以下:Connected to:
Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - Production
With the Partitioning, OLAP and Data Mining optionsSQL> ed
Wrote file afiedt.buf 1 CREATE OR REPLACE package myPackage is
2 a NUMBER;
3 vara NUMBER;
4 varx NUMBER;
5 function g return NUMBER;
6 function f(x IN out NUMBER) return NUMBER;
7* END mypackage;
8 /Package created.SQL> ed
Wrote file afiedt.buf 1 CREATE OR REPLACE package body mypackage is
2 function g return NUMBER
3 AS
4 BEGIN
5 a :=2;
6 return f(a);
7 END g;
8 function f(x IN OUT NUMBER)
9 return NUMBER
10 AS
11 BEGIN
12 a := a+1;
13 vara :=a;
14 x := x+2;
15 varx :=x;
16 return a*x;
17 END f;
18* END mypackage;
SQL> /Package body created.SQL> ed
Wrote file afiedt.buf 1 BEGIN
2 dbms_output.put_line(mypackage.vara);
3 dbms_output.put_line(mypackage.varx);
4 dbms_output.put_line(mypackage.g());
5* END;
SQL> /
12PL/SQL procedure successfully completed.SQL> ed
Wrote file afiedt.buf 1 BEGIN
2 dbms_output.put_line(mypackage.vara);
3 dbms_output.put_line(mypackage.varx);
4 dbms_output.put_line(mypackage.g());
5* END;
SQL> /
3
4
12PL/SQL procedure successfully completed.SQL>
可以看到 这段程序包 运行结果是12!!!!!!!! 而且要运行第二次 vara 和varx 才能被打印出来;请教为什么in out 不能代表引用,如果不能 那用什么来表示 c++中的引用,这个怎么翻译(纯粹只是做实验,路过不要拍砖)。顺便解释下为什么要运行两次
#include<stdio.h>
using namespace std;
int g();
int f(int& );
int a;
int g() {
a=2;
return f(a);
}
int f(int& x) {
a=a+1;
cout<<"f(int& x) a:"<<a<<endl;
x=x+2;
cout<<"f(int& x) x:"<<x<<endl;
cout<<"f(int& x) a*x:"<<a*x<<endl;
return a*x;
}
int main() {
cout<<"g():"<<g()<<endl;
getchar();
}
运行结果是:
f(int& x) a:3
f(int& x) x:5
f(int& x) a*x:25
g():25
因为传的是引用,相当于 a 和 x 指向的是同一个变量,最后a*x当然也就是 a的平方,可以理解。于是 我想把它翻译成oralce的程序包,我的思路是 用in out 传参模式表示传引用,于是有以下:Connected to:
Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - Production
With the Partitioning, OLAP and Data Mining optionsSQL> ed
Wrote file afiedt.buf 1 CREATE OR REPLACE package myPackage is
2 a NUMBER;
3 vara NUMBER;
4 varx NUMBER;
5 function g return NUMBER;
6 function f(x IN out NUMBER) return NUMBER;
7* END mypackage;
8 /Package created.SQL> ed
Wrote file afiedt.buf 1 CREATE OR REPLACE package body mypackage is
2 function g return NUMBER
3 AS
4 BEGIN
5 a :=2;
6 return f(a);
7 END g;
8 function f(x IN OUT NUMBER)
9 return NUMBER
10 AS
11 BEGIN
12 a := a+1;
13 vara :=a;
14 x := x+2;
15 varx :=x;
16 return a*x;
17 END f;
18* END mypackage;
SQL> /Package body created.SQL> ed
Wrote file afiedt.buf 1 BEGIN
2 dbms_output.put_line(mypackage.vara);
3 dbms_output.put_line(mypackage.varx);
4 dbms_output.put_line(mypackage.g());
5* END;
SQL> /
12PL/SQL procedure successfully completed.SQL> ed
Wrote file afiedt.buf 1 BEGIN
2 dbms_output.put_line(mypackage.vara);
3 dbms_output.put_line(mypackage.varx);
4 dbms_output.put_line(mypackage.g());
5* END;
SQL> /
3
4
12PL/SQL procedure successfully completed.SQL>
可以看到 这段程序包 运行结果是12!!!!!!!! 而且要运行第二次 vara 和varx 才能被打印出来;请教为什么in out 不能代表引用,如果不能 那用什么来表示 c++中的引用,这个怎么翻译(纯粹只是做实验,路过不要拍砖)。顺便解释下为什么要运行两次
形参和实参是两个不同的变量,对应不同的内存地址。
这就可以理解,为什么a的值为3,而x值仍为2。
2、第一次执行时:vara、varx开始都没有赋值,所以都为null,然后在output中调用g,
打印函数g的返值,所以输出12。