csrf跨站请求伪造、csrf校验策略、csrf相关装饰器、auth认证模块、auth认证相关模块及操作、扩展auth_user表

今日内容

csrf跨站请求伪造

钓鱼网站:模仿一个正规的网站 让用户在该网站上做操作 但是操作的结果会影响到用户正常的网站账户,但是其中有一些猫腻

eg:英语四六级考试需要网上先缴费,但是你会发现卡里的钱扣了但是却交到了一个莫名其妙的账户,并不是真正的四六级官方账户

模拟钓鱼网站转账案例

真网站:
	<h1>真网站</h1>
<form action="" method="post">
    <p>用户名:
        <input type="text" name="username">
    </p>
    <p>转账人姓名
        <input type="text" name="target_name">
    </p>
    <p>转账金额
        <input type="text" name="money">
    </p>
        <input type="submit">
</form>

假网站:内部隐藏标签
	<form action="http://127.0.0.1:8000/transfer/" method="post">
    <p>用户名:
        <input type="text" name="username">
    </p>
    <p>转账人姓名
        <input type="text" >
        <input type="text" name="target_name" value="日日" style="display: none">
    </p>
    <p>转账金额
        <input type="text" name="money">
    </p>
        <input type="submit">
</form>

csrf校验策略

再提交数据的位置添加唯一标识


1.form表单csrf策略
	form表单内部添加 {% csrf_token %}

2.ajax请求csrf策略
	// 方式1:自己动手取值 较为繁琐  			{#data{'csrfmiddlewaretoken':$('input[name="csrfmiddlewaretoken"]').val()},#}
        
   // 方式2:利用模板语法自动获取(一定要用引号引起来)
{#data{'csrfmiddlewaretoken':'{{csrf_token}}','username':'jason'},#}
    
   // 方式3:直接引入一个js脚本即可(官网提供的)
 	参考:http://www.cnblogs.com/Dominic-Ji/p/9234099.html
    

csrf相关装饰器

from django.views.decorators.csrf import csrf_exempt,csrf_protect #导入模块

csrf_exemp		#整个django项目都校验csrf  某个视图函数/类不需要进行csrf校验
csrf_protect	#整个django项目都不校验csrf 某个视图类函数/类需要进行csrf校验

FBV:

#FBV使用直接加就行 与正常函数一直
@csrf_exempt
def index(request):
    pass
"""把csrf_exempt装饰器直接加到index函数中,使该函数不需要经过csrf验证(配置文件开启csrf验证)

CBV:

方式1:单独生效
	from django.utils.decorators import method_decorator #导入模块
    class MyView(views.View):
    @method_decorator(csrf_protect)
    def post(self,request):
        return HttpResponse('from cbv post view')
'''在函数上面添加装饰器 在括号里面填写装饰器的名字 '''


方式2:单独生效
@method_decorator(csrf_protect,name='post')
class MyView(views.View):
    def post(self,request):
        return HttpResponse('from cbv post view')
    
'''在类的上面添加装饰器 括号里写装饰器的名字 和 想要添加装饰器的函数名'''   


方式3:全局有效
	class MyView(views.View):
    @method_decorator(csrf_protect)
    def dispatch(self, request, *args, **kwargs):
        return super().dispatch(request,*args,**kwargs)

    def post(self,request):
        return HttpResponse('from cbv post view')
'''在dispatch方法上面加 修改全局'''

注意:装饰器>>>:csrf_exempt特殊
    只有在dispatch方法上添加 才生效 

auth认证模块

前戏:django自带一个admin路由 但是需要我们提供管理员账号和密码
如果想要使用admin后台管理 需要先创建表 然后创建管理员账号 
直接执行数据库迁移命令即可产生默认的auth_user表 该表就是admin后台管理默认的认证表

创建超级管理员 
createsuperuser

auth认证相关模块及操作

用户注册:

from django.contrib.auth.models import User


def register_func(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        # 校验用户名是否已存在
        res = User.objects.filter(username=username)
        if res:
            return HttpResponse('用户名已存在')
        # 注册该用户(不能自己创建 因为密码加密无法实现)
        User.objects.create_user(username=username, password=password)
    return render(request, 'register.html')
'''
注意:创建用户的时候不要再用create方法 用create_user 可以将密码加密
'''

用户登录:

def login_func(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        #校验用户名和密码是否正确(自己无法比对密码 返回一个用户对象
        res=auth.authenticate(request,username=username,password=password)
        if res :
            #用户登陆成功 返回一个凭证
            auth.login(request,res) #自动操作
            return HttpResponse('登陆成功')
    return render(request,'login.html')

'''
获取到用户名和密码之后要进行比对 
自己无法比对密码 用到auth模块  返回的是一个用户对象 
保存session 用auth模块可以自动操作django_session表
'''

判断用户是否登录:

request.user.is_authenticated

获取登录用户对象数据:

request.uesr

校验用户是否登录装饰器:

from django.contrib.auth.decorators import login_required

@login_required(login_url = '/login/')		局部配置
配置文件 LOGIN_URL = '/login/' 				  全局配置

校验原密码是否正确:

request.user.check_password(原密码)

修改密码:

request.user.set_password(新密码)
request.user.save()

退出登录:

auth.logout(request)
自动操作session

扩展auth_user表

还想使用auth模块的功能 并且又想扩展auth_user表的字段
思路1:一对一字段关联
思路2:替换auth_user表
	步骤1:模型层编写模型类继承AbstractUser
   		from django.contrib.auth.models import AbstractUser
       class UserInfo(AbstractUser):
        # 填写AbstractUser表中没有的字段
        phone = models.BigIntegerField()
        desc = models.TextField()
 	步骤2:一定要在配置文件中声明替换关系
        AUTH_USER_MODEL = 'app01.UserInfo'
	ps:替换还有一个前提 就是数据库迁移没有执行过(auth相关表没有创建
本文转载于网络 如有侵权请联系删除

相关文章

  • 绘图技巧 | 绘制带饼图的地图可视化技巧分享

    这一期呢,小编回应读者的需求,绘制在地图上添加饼图的可视化作品,这类图表在GIS或生态方面涉及的比较多哈。本期内容主要如下: R-scatterpie包主要函数介绍R-scatterpie包实例演示R-scatterpie包主要函数介绍要想在地图上绘制饼图,使用常规的ggplot2较为繁琐,得益于丰富第三方包,我们可以使用scatterpie包轻松实现该需求。scatterpie包主要有:geom_scatterpie()geom_scatterpie_legend()前者主要用于绘制饼图绘制,后者则对应绘制饼图大小的图例,具体可参考如下链接:https://cran.r-project.org/web/packages/scatterpie/vignettes/scatterpie.html。接下来,小编将结合具体实际例子用于帮助小伙伴们理解scatterpie绘制函数,快速绘制带饼图的空间地图可视化作品。R-scatterpie包实例演示这一部分我们分别通过虚构数据绘制美国和中国的饼图地图作品,所使用的数据也会在文末给出免费获取方式。「以美国地图为例」数据处理代码如下(较为简单且都

  • ida使用方法及注意事项

    IDAPro:交互式反汇编器,是典型的递归下降反汇编器。ida反编译so文件,注意事项:ida版本最好是7.0往上的版本,否则有些so文件反编译之后,f5不能查看伪代码。相关文章:https://www.jianshu.com/p/a12d04fc748f常用命令:导航条: 蓝色表示常规的指令函数 黑色节与节之间的间隙 银白色数据内容 粉色表示外部导入符号 暗黄色表示ida未识别的内容 IDA主界面: IDAView三种反汇编视图:文本视图、图表视图、路径视图 HexView十六进制窗口 Imports导入函数窗口 Struceures结构体窗口 Exports导出函数窗口 Enums枚举窗口 Strings字符串窗口 常用功能及快捷键: 空格键:切换文本视图与图表视图 ESC:返回上一个操作地址 G:搜索地址和符号 N:对符号进行重命名 冒号键:常规注释 分号键:可重复注释 Alt+M:添加标签 Ctrl+M:查看标签 Ctrl+S:查看段的信息 代码数据切换 C-->代码/D-->数据/A-->ascii字符串/U

  • nginx动态proxy_pass

    有时我们想根据用户请求的参数转发到不同的upstream,像做多机房用户路由的时候是非常有用的,实现有多种方式,一是设置不同的loction,然后让lua动态执行不同的子请求;还有就是将upstream设置成变量,让lua根据参数动态计算出upstream。下面演示第二种方式,假设我们的域名为aa.com,nginx配置如下:upstreamorder0{ server127.0.0.1:12580; } upstreamorder1{ server127.0.0.1:11580; } server{ listen443ssl; server_nameaa.com; location/{ set_by_lua_file$ups/data/lua/upsteam.lua; add_headerX-CLOSED0; proxy_pass_headerServer; proxy_set_headerHost$http_host; proxy_redirectoff; proxy_set_headerX-Real-IP$remote_addr; proxy_set_headerX-F

  • Cypress系列(56)- 避免访问多个站点

    如果想从头学起Cypress,可以看下面的系列文章哦https://www.cnblogs.com/poloyy/category/1768839.html背景为了绕开同源策略的限制而实现的方案,使得Cypress不能支持在一个测试用例文件里访问多个不同域名的URL如果访问了多个不同域名的站点,Cypress会直接报错避免访问多个站点访问相同超域如果访问的是同一个超域下的不同子域,则Cypress允许你正常访问it('访问同一超域下的不同子域',function(){ cy.visit('https://example.cypress.io') cy.visit('https://www.cypress.io/features') });复制测试结果访问不同超域it('访问不同超域,会报错',function(){ cy.visit('https://example.cypress.io') cy.visit('https://www.cnblogs.com/poloyy/&#

  • 802.11ax(wifi6)初识

    简介:IEEE802.11ax(wifi6)又称为高效率无线标准(High-EfficiencyWireless,HEW),通过一系列系统特性和多种机制增加系统容量,通过更好的一致覆盖和减少空口介质拥塞来改善Wi-Fi网络的工作方式,使用户获得最佳体验;尤其在密集用户环境中,为更多的用户提供一致和可靠的数据吞吐量,其目标是将用户的平均吞吐量提高至少4倍。也就是说基于802.11ax的Wi-Fi网络意味着前所未有的高容量和高效率。WIFI6的由来:WiFi联盟在2018年10月4号公布了最新的网络协议新标准WiFi6,它的标准代码为802.11ax。这是如今最新的WiFi标准,而且此次WiFi标准彻底改变了曾经传统的命名方式,它放弃了802.11命名的方案,使用了数字的序号。 这样的好处是,使得人们可以更加容易的区分出新WiFi和旧WiFi的区别,而且wifi联盟的总裁表示,如今采用全新的命名方式,可以帮助用户或者WiFi的提供者来更好的辨别这种WiFi是否支持它的设备。 如今WiFi已经发展到第六代了。从802.11b也就是WiFi1开始,一直到如今802.11ax也就是WiFi6代,

  • 产品的细节能决定成败吗?

    小编说:“细节决定成败”,但是在产品的不同阶段,决定成败的细节是不一样的。如果我们在某个阶段纠结不该在该阶段处理的细节,就会造成资源的浪费,也会造成产品节奏出现问题。在MVP阶段,既然是最简可行产品,是否不需要关注细节呢?不是的。在这个阶段一样要关注细节,但一定要注意是与验证产品想法直接相关的细节,这类细节打磨得越好,对产品验证方向和想法越有利,而对于其他无关的细节,只要是可用的状态,最好不要花太多时间和精力。比如搜狗输入法有一个“趣图”功能,是一个在输入关键词后搜索图片和表情的功能。在早期,我们想验证在搜狗输入法提供的图片表情包之外,通过文字搜索配图和表情这个功能也是用户需要的,于是做了一个包含该功能的实验包,准备做小流量实验。在内部试用过程中,我们发现在滑动屏幕浏览配图时不够顺畅,经过讨论,我们决定把浏览配图的体验做到自己满意再发布实验包。因为虽然滑动浏览配图的体验是很细微的体验,但如果这块体验没有做好,很可能会造成用户弃用这个搜索配图的功能,而如果是由于这个原因造成实验包效果不好,那么根本无法真正检测搜索配图片这个想法是否是用户所需要的,很可能让我们产生误解,认为实验包效果不好是

  • 微分私有可分解子模最大化(CS LG)

    我们研究可分解的子模函数的微分私有约束最大化问题。如果一个子模函数采取子模函数之和的形式,则该子模函数是可分解的。一个单调的、可分解的子模函数在基数约束下最大化的特殊情况被称为CombinatorialPublicProjects(CPP)problem。之前Gupta等人的工作给出了CPP问题的差分私有化算法。我们对这项工作进行了扩展,设计了在一般matroid约束下的单调性和非单调性可分解子模最大化的差分私有化算法,并提供了竞争性效用保证。我们用实验来补充我们的理论界线,通过实验证明了我们的理论界线的性能,在一般的子模态最大化的情况下,这种性能比差分私有算法更好,并且接近于非私有算法的性能。原文题目:DifferentiallyPrivateDecomposableSubmodularMaximizationDifferentiallyPrivateDecomposableSubmodularMaximization原文:Westudytheproblemofdifferentiallyprivateconstrainedmaximizationofdecomposablesubm

  • virtualbox只能选用网络地址转换(NAT)模式下搭建个人局域网

    版权声明:本文为博主原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/qq_37933685/article/details/84066094个人博客:https://suveng.github.io/blog/​​​​​​​virtualbox只能选用网络地址转换(NAT)模式下搭建个人局域网这里先引用以为大佬的博客,上面清楚的介绍虚拟机网络的集中配置。我这里简单说一下网络地址转换,详细请查阅https://blog.csdn.net/gsl371/article/details/78662258网络地址转换(NAT)特点​ 1、如果主机可以上网,虚拟机可以上网 ​ 2、虚拟机之间不能ping通 ​ 3、虚拟机可以ping通主机(此时ping虚拟机的网关,即是ping主机) ​ 4、主机不能ping通虚拟机应用场景​ 虚拟机只要求可以上网,无其它特殊要求,满足最一般需求配置方法​ 连接方式选择网络地址转换(NAT) ​ 高级-控制芯片选择PCnet-FASTIII ​ 高级-混杂模式拒绝

  • 几种Windows服务器时间同步的设置

    通常情况下,Windows2000/xp/2003域成员有个w32time时间服务,它会自动与域DC进行时间同步,无需人为干涉,保持域内时间的同步是kerberos认证协议的一个基本要求,也是为了防止重放攻击的一种手段,如果域成员客户机与DC的时间相差太大的话,它的登录将不能成功,从而影响使用。为了达到和DC时间同步,必须进行设置。以下对各种不同的设置方法进行比较分析:1、手工修改时间方法 知道服务器时间,然后通过“时间和日期属性”修改。 优点:简单易用 缺点:需要知道服务器时间2、命令行实现 在命令行打入“nettime\server/set/y”,即可生效 优点:功能比较强大, 缺点:易用性差3、计划任务自动实现 这个方法和上述类似,只是把这个命令写成脚本(保存为*.vbs),放在启动菜单或加到计划任务中执行,脚本如下: DimoShell SetoShell=WScript.CreateObject("WSCript.shell") oShell.run"nettime\server/set/y" SetoShell=Nothing注:se

  • [Go 语言社区]Golang架构--服务器与客户端自定义传输规则--原创

    对于写过架构的童鞋来说,自己封装传输规则也没有任何问题的,本文只是抛砖引玉,简单的说下我曾经和现在服务器使用的传输的规则,敬请看:对于服务器和客户端通信,我们在实现功能的时候,对于功能及大的模块话功能时候必须明确,没有制定一个好的容易理解的协议规则,功能开发过程中会遇到很多问题;我设计的传输规则架构采用主、从协议来定制,如下:以心跳协议为例子://【1】通信相关Network_Data_Proto子协议 const( NetworkINIT=iota //心跳检测 Net_Heart_Beating_Proto//Net_Heart_Beating_Proto==1心跳检测 ) //-------------------------------------------------------------------------------- //【心跳检测】Net_Heart_Beating_Proto typeNet_Heart_Beatingstruct{ Protocoluint32//主协议 Protocol2uint32//子协议 }复制这个就是协议规则的最简单的协议,假如客

  • Python学习三天计划-1

    一、第一个Python程序 配置好环境变量后 打开CMD(命令提示符)程序,输入Python并回车 然后,在里面输入代码回车即可立即执行 Python解释器的作用是 将Python代码翻译成计算机认识的0和1并提交计算机执行 在解释器环境内可以一行行的执行我们输入的代码 也可以使用解释器程序,去执行”.py”代码文件 二、字面量 在代码中,被写下来的的固定的值,称之为字面量 Python中常用的有6种值(数据)的类型 被引号包围起来的,都是字符串 类型 描述 说明 数字(Number) 支持•整数(int)•浮点数(float)•复数(complex)•布尔(bool) 整数(int),如:10、-10浮点数(float),如:13.14、-13.14复数(complex),如:4+3j布尔,True表示真1,False表示假0 字符串(String) 描述文本的一种数据类型 字符串(string)由任意数量的字符组成 列表(List) 有序的可变序列 Python中使用最频繁的数据类型,可有序记录一堆数据 元组(Tuple) 有序的不可变序列 可

  • 转: 关于在linux下清屏的几种技巧

    转:关于在linux下清屏的几种技巧 http://www.cnblogs.com/5201351/p/4208277.html

  • JS 的Date对象

    一、获取Date对象    在JS中我们可以通过下面一段代码获取本地时间 varcurrentDate=newDate(); alert("currentDate:"+currentDate);复制    这样我们可以获取到当前时间,其输出信息如下:SatJul27201322:04:17GMT+0800(中国标准时间); 如果不想已这种形式出现,可以转化为本地时间,使用方法toLocaleString即可,其输出信息是:2013年7月27日下午10:07:06。 这些都是很简单的方式,相关的一些操作在网络中也可以找的到,参考这个网站http://www.w3school.com.cn/js/jsref_obj_date.asp,可以获取更多的信息。 在这里我想说说我之前遇到的一些问题和现象。 JS中我们有两种方式可以创建Date对象,一个是通过数字参数newDate(yyyy,MM,dd),一个是通过字符串参数newDate('yyyy/MM/dd');其中yyyy代表的是年份,MM是月份,dd代表的是天。  

  • 注意事项

    有关1<<64。测试: usingnamespacestd; #include<iostream> intmain(){ cout<<(1<<64)<<endl; cout<<(1ll<<64)<<endl; cout<<(1ull<<64)<<endl; intk=64; cout<<(1<<k)<<endl; cout<<(1ll<<k)<<endl; cout<<(1ull<<k)<<endl; return0; } 复制 结果: 0 0 0 1 1 1 复制 所以不要随便左移64位。 有关四舍五入: usingnamespacestd; #include<cstdio> #include<cmath> intmain(){ doublea=0.5,b=0.5+1e-16,c=0.5+1e-

  • 面向对象、封装、继承、多态

    面向对象和面向过程的思想对比:   面向过程:是一种以过程为中心的编程思想,实现功能的每一步,都是自己实现的   面向对象:是一种以对象为中心的编程思想,通过指挥对象实现具体的功能   类和对象的关系 客观存在的事物皆为对象,所以我们也常常说万物皆对象。   类的理解     类是对现实生活中一类具有共同属性和行为的事物的抽象       类是对象的数据类型,类是具有相同属性和行为的一组对象的集合 类的组成   属性:指事物的特征,例如:手机事物(品牌,价格,尺寸)     行为:指事物能执行的操作,例如:手机事物(打电话,发短信)     简单理解:类就是对现实事物的一种描述     类和对象的关系     类:类是对现实生活中一类具有共同属性和行为的事物的抽象     对象:是能够看得到摸的着的真实存在的实体     简单理解:类是对事物的一种描

  • LeetCode题解之Binary Tree Paths

    1、题目描述 2、分析 使用递归。 3、代码 1vector<string>ans; 2 3vector<string>binaryTreePaths(TreeNode*root){ 4 5if(root==NULL)returnans; 6leafPath(root,""); 7returnans; 8 9 10} 11 12voidleafPath(TreeNode*root,strings) 13{ 14if(root==NULL) 15return; 16if(root->left==NULL&&root->right==NULL){ 17stringstmp=s+to_string(root->val); 18ans.push_back(stmp); 19return; 20}else{ 21stringstmp=s+to_string(root->val)+"->"; 22leafPath(root->left,stmp); 23leafPath(root->right,stmp); 24

  • 软工实践个人总结

    一、请回望第一次作业,你对于软件工程课程的想象 1)对比开篇博客你对课程目标和期待,“希望通过实践锻炼,增强计算机专业的能力和就业竞争力”,对比目前的所学所练所得,在哪些方面达到了你的期待和目标,哪些方面还存在哪些不足,为什么? 想了想,知道一款游戏是怎么做的,这是最大的收获吧,其他有学到一些unity和C#的知识,但是和我内心的期待还有差距吧,主要是组长给分配的任务就是做那些东西,我当初又不知道游戏具体要怎么做,自己也没有主动去找任务做,就这样看 2)总结这门课程的实践总结和给你带来的提升,包括以下内容: 1、统计一下,你在这门软件工程实践中,完成了多少行的代码; 刚刚看了看,从第一次作业到最后的团队作业应该有4k+多行 2、软工实践的各次作业分别花了多少时间?(做一个列表) 作业 时间 第一次个人编程 30h左右 结队作业 20+h 团队作业 120h左右 3、哪一次作业让你印象最深刻?为什么? 其实还是结队作业吧,自己是组内空余的一人,然后要和其他组的人组队,本来认为,可能会遇到比较懒的人,但是后面结果其实很满意的,队友很认真 4、累计花了多少个小时在

  • PHP微信公众号后台开发(Yii2实现)

    本文内容较多,包括微信接入、获取微信用户信息、微信支付、JSSDK配置参数获取等部分。如果读者对微信开发没有一个主观上的认识,那么建议读者先研读微信公众平台开发者文档,然后再阅读本文,效果更佳!另外本文的分章节版本可以在八宝粥的博客找到。 20160712-Update:微信开发的完整例子已经整理在Github,欢迎查看:yii2-wechat-demo。 接入微信 Yii2后台配置 1.在app/config/params.php中配置token参数 return[ //微信接入 'wechat'=&gt;[ 'token'=&gt;'yourtoken', ], ]; 复制 2.在app/config/main.php中配置路由 因为接口模块使用的RESTfulAPI,所以需要定义路由规则。 'urlManager'=&gt;[ 'enablePrettyUrl'=&gt;true, 'enableStrictParsing'=&gt;true, 'showScriptName'=&gt;false, 'rules'=&am

  • 左外连接/右外连接

    假设a表有两个字段,Aid、name, b表也有两字段Bid,nameid其中nameid是Aid在b表中的外键。 a表有数据如下: Aid name 1    a 2   b 3  c b表有数据如下: Bid nameid 1   1 2   1 3   1 4   2 5   2 用左连接,说白一点就是以左边那个表为标准,左边那表(表a)的所有记录必须得全部出现, 例如:select*fromaleftjoinbona.Aid=b.nameid结果应应该为: Aid name Bid nameid 1   a      1   1 1   

  • 线段树——vijos1083

    https://vijos.org/p/1083 就是线段树啦,好像在洛谷也有怎么类似的一题; structtree{intl,r,x,y,v,sum;}T[1048576]复制 l,r就是区间啦,v表是这段区间的最优值; sum是这一段的总和; x是一定包括l点的最优值; y是一定包括r点的最优值; 当然喽,因为一定要取公园所以可以负数; 更新 voidup(intnum){ intx=num*2,y=x+1; T[num].v=max(T[x].v,T[y].v); T[num].v=max(T[num].v,T[x].y+T[y].x); T[num].sum=T[x].sum+T[y].sum; T[num].x=max(T[x].x,T[x].sum+T[y].x); T[num].y=max(T[y].y,T[y].sum+T[x].y); }复制 不想讲什么了,反正是比较显然的啦,就是分类讨论; 然后我们查询答案,不是有一个区间l~r的; 这个区间会被线段树分成很多段; 那我们把这些段一个一个存下来从左到右合并成一个; 就好啦; #include<

  • Oracle 在存储过程或函数中执行字符串sql

    有时,我们需要在存储过程或函数中根据条件拼凑一些sql字符串语句,然后再执行拼凑后的sql字符串,如何做到呢? 参考以下代码: FUNCTIONCALCULATE_TARGET_SCORE(CUR_MONTHINNVARCHAR2) RETURNNCLOB IS PRAGMAAUTONOMOUS_TRANSACTION; TVALUE_SQLVARCHAR2(2000);--查询目标值的sql(不能把类型声明为NVARCHAR2) RESULT_STRNCLOB; KPI_VALUENVARCHAR2(200); CUR_MONTH_BILL_IDNUMBER(19);--固话单ID BEGIN --获得当前固话单 SELECTMAX(ID) INTOCUR_MONTH_BILL_ID FROMGP_MONTH_BILL WHEREMONTH=CUR_MONTHANDIS_USE=1; --循环获得每个明细的完成值sql IFCUR_MONTH_BILL_ID>0--区县指标 THEN TVALUE_SQL:= 'SELECTTO_CHAR(' ||CUR_ROW.MAI

相关推荐

推荐阅读