以下是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++中的引用,这个怎么翻译(纯粹只是做实验,路过不要拍砖)。顺便解释下为什么要运行两次

解决方案 »

  1.   

    1、oracle中in、out或者 in out参数都是传值的,不传引用。out参数也是复制一个值,
         形参和实参是两个不同的变量,对应不同的内存地址。
         这就可以理解,为什么a的值为3,而x值仍为2。
    2、第一次执行时:vara、varx开始都没有赋值,所以都为null,然后在output中调用g,
         打印函数g的返值,所以输出12。